Python面向物件(類)筆記
阿新 • • 發佈:2022-05-08
一、面向物件程式設計
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()