1. 程式人生 > 其它 >Python面向物件(類)筆記

Python面向物件(類)筆記

一、面向物件程式設計

​ 1、面向物件程式設計

​ 1.1一種程式設計正規化

​ 1.2程式由物件組成,物件包含公開的功能和隱藏的功能

​ 1.3物件是資料與相關行為得集合

​ 2、類:物件的型別,構造物件的模板

二、自定義類

​ 1、建立類

class ClassName:
    '''類的資訊'''

​ 2、類方法

​ def來定義方法

​ 方法必須含引數self,且為第一個引數

​ self並非python關鍵字,可寫其他名稱,但慣例寫作self

​ self代表類的例項,在呼叫時不必傳入相應引數

​ 同名的資料屬性會覆蓋方法

​ 屬性方法前加__ 約束外部訪問 僅僅是約定

class Constomer:
    #init初始化方法,類例項化時會自動呼叫
 	#有seif引數,也可有額外的引數
    #只能返回None 
    #常用
    def __init__(self,name):
        self.name=name

​ 3、例項化類、呼叫類方法

#顧客類
class Consumer:
	def __init__(self,name):
		self.name=name
#餐館類
class Restraunt:
	''' REstraunt class
	properties: name, location
	methods: checkin, checkout
	'''
	#餐館編號記錄  類的資料
	RID=0
	#初始化  名稱、地址、編號、顧客列表
	def __init__(self,name,location):
		self.name=name
		self.location=location
		self.id=Restraunt.RID
		self.consumer_list=[]
		Restraunt.RID+=1
	#新增顧客
	def chekin(self,c:Consumer):
		self.consumer_list.append(c)
	#刪除顧客
	def checkout(self,c:Consumer):
		self.consumer_list.remove(c)
	#輸出顧客姓名
	def print_consumers(self):
		for con in self.consumer_list:
			print(con.name)

def main():
	#例項化類,呼叫類方法
	print(Restraunt.RID)
	c1=Consumer('Akam')
	c2=Consumer('Dice')
	c3=Consumer('Blaze')
	r1=Restraunt('KFC','11,12')
	r2=Restraunt('McDoload','11,12')
	r1.chekin(c1)
	r1.chekin(c2)
	r1.checkout(c1)
	r2.chekin(c1)
	r2.chekin(c3)
	print(r1.id)
	print(r2.id)
	r1.print_consumers()

if __name__=='__main__':main()

三、類的繼承

​ 繼承其他類的類稱為派生類,被繼承為基類

​ 1、繼承語法

class Dclassname(Bclassname):
    

​ 2、過載

​ 一個類裡,方法名字相同,引數不同。過載是用來處理不同資料型別的手段,可以解決可變引數型別和個數。

​ 由於 python 可以接受任何型別的引數,可以接受預設引數,所以不需要函式過載

​ python 有運算子過載

​ 3、重寫

​ 子類對父類方法重寫,方法覆蓋

​ 4、子類呼叫父類函式

#法1  類呼叫
class C(A,B):
	def fu(self):
		#呼叫父類方法括號要加self,表明這是類呼叫
		A.fu(self)
		print('ccc')
#法2  super
class C(A,B):
	def fu(self):
		super().fu()
		print('ccc')
#super()方法呼叫A類,預設多繼承從左到右順序呼叫
#要呼叫B類,super修改
class C(A,B):
	def fu(self):
		super(C,self).fu()
		super(A,self).fu()
		print('ccc')
super(C,self).fu()		#呼叫最左邊的方法
super(A,self).fu()		#呼叫A類後面的的方法
#呼叫哪個只需要寫前一個就行

​ 5、案例

class People:
	#人的類,姓名、身高、年齡
	def __init__(self,name,height,age):
		self.__name=name
		self.__height=height
		self.__age=age
	def get_name(self):
		return self.__name
	def set_name(self,name):
		self.__name=name
	def get_height(self):
		return self.__height
	def set_height(self,height):
		self.__height=height
	def get_age(self):
		return self.__age
	def set_age(self,age):
		self.__age=age
	#獲取資訊
	def print_info(self):
		print('Name:{},Age:{},Height:{}'.\
			format(self.get_name(),self.get_age(),self.get_height()))
	#運算子過載
	def __add__(self,other):
		return self.get_height()+other.get_height()

class Career():
	#職業類
	def __init__(self,topic):
		self.__topic=topic
	def get_topic(self):
		return self.__topic
	def set_topic(self,topic):
		self.__topic=topic
	def speak(self):
		print("the career is {}".format(self.get_topic()))

class Student(People,Career):
	#學生類,繼承人的類,同時新增一些新的屬性,並覆蓋方法
	#初始化  新增新屬性  
	def __init__(self,name,height,age,topic,ID,major):
		People.__init__(self,name,height,age)
		Career.__init__(self,topic)
		self.__ID=ID
		self.__major=major
	#新增的新方法
	def get_ID(self):
		return self.__ID
	def set_ID(self,ID):
		self.__ID=ID
	def get_major(self):
		return self.__major;
	def set_major(self,major):
		self.__major=major
	#方法覆蓋
	def print_info(self):
		print('ID:{}, Name:{}, Major:{}, Age:{}, Height:{}'.\
			format(self.get_ID(),self.get_name(),self.get_major(), self.get_age(),self.get_height()))
	#方法重寫  
	def speak(self):
		super(Student,self).print_info()
		super(Student,self).speak()


p1=People('Dnna',185,40)
s1=Student('Alice',185,35,'teacher',33060828,'chemistry')
print(s1)
print(p1+s1)
s1.speak()
s1.print_info()