Python 繼承
Python 繼承 |
類的繼承(一)
繼承
面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。
通過繼承創建的新類稱為“子類”或“派生類”。
被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過程,就是從一般到特殊的過程。
要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。
在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
繼承概念的實現方式主要有2類:實現繼承、接口繼承。
? 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
? 接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構爹類方法);
在考慮使用繼承時,有一點需要註意,那就是兩個類之間的關系應該是“屬於”關系。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。
抽象類僅定義將由子類創建的一般屬性和方法。
OO開發範式大致為:劃分對象→抽象類→將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。
繼承示例(1)
#BlackPerson類 繼承 Person類 #動作: #BlackPerson可調用Person的talk方法 class Person(object): def talk(self): print("person is talking...l") class BlackPerson(Person): pass b = BlackPerson() b.talk() #輸出結果 #person is talking...l
繼承示例(2)
#BlackPerson類 繼承 Person類 #動作: #BlackPerson繼承 新增方法walk#BlackPerson繼承 重寫父類talk class Person(object): def talk(self): print("person is talking...1") class BlackPerson(Person): def talk(self): print("person is talking...2") def walk(self): print("is walking....") b = BlackPerson() b.talk() b.walk() #輸出結果 #person is talking...2 #is walking....
繼承式列(3)
------------------------------------------------------------------------------------------------------------------------
#BlackPerson類 WhitePerson 類 繼承 Person類 #動作1: #Person父類 添加name,age元素 #註:父類添加元素後,對象也許添加元素否則報錯 # #動作2: #BlackPerson類新建構造函數,並繼承父類構建函數,先繼承後重組。 #註:子類需要有父類構造函數內的元素,後可新建元素,調用父類 # 成員屬性下,添加構造函數。
#
#原理: #註:如圖1,當子類函數,獲取到name,age元素時,會傳給下面父類的 # 子類元素,父類獲取到子類元素會把傳到的值,劃分給構建函數內的 # 成員屬性,完成先繼承後重組的步驟。
#
#動作3:
#註:在子類繼承父類後,可新建自己類的成員屬性
#
#動作4:
#子類方法下也可使用父類的繼承方法
#註:父類.方法(self) 但這樣做沒有意義。
class Person(object): def __init__(self,name,age): self.name = name #self = b self.name = b.name self.age = age self.sex = "noraml" def talk(self): print("person is talking...1") class BlackPerson(Person): def __init__(self,name,age ,strength): #先繼承,在重構(動作1) Person.__init__(self,name,age) #父類調用子類元素(動作2)
self.strength = tering #繼承父類後可調用自己的成員元素(動作3)
def talk(self):
Person.tslk(self) #調用父類方法(動作4) print("person is talking...2") def walk(self): print("is walking....") b = BlackPerson("Kevin","22") class WhitePerson(Person): pass
------------------------------------------------------------------------------------------------------------------------
類的繼承(二)
實戰案例
class SchoolMember(object): #基類 ‘‘‘學校成員基類‘‘‘ member = 0 #註冊成員數 def __init__(self,name,age,sex): #基類構造函數 self.name = name self.age = age self.sex = sex self.enroll() #註冊方法,直接調用給子類 def enroll(self): #註冊成員,每多出一個對象就+1 ‘‘‘註冊‘‘‘ print("just enrolled a new school member [%s]"%self.name) SchoolMember.member += 1 def tell(self): #問題2.在不改寫子類的情況下,通過基類打印,不同子類的信息。 """循環打印人員信息""" print("-------info:%s---------"%self.name) for k,v in self.__dict__.items(): print("\t",k,v) def __del__(self): #問題1,刪除成員後自動減註冊表。 ‘‘‘析構函數,開除一個人後註冊表-1‘‘‘ print("開除了[%s]..."%self.name) SchoolMember.member -=1 #每有一個對象刪除就減1 class Teacher(SchoolMember): #子類 ‘‘‘講師類‘‘‘ def __init__(self,name,age,sex,salary,course): #包含基類並新建元素 SchoolMember.__init__(self,name,age,sex) #繼承基類構造 self.salary = salary self.course = course def teching(self): #方法 print("Teacher[%s] is teaching [%s]"%(self.name,self.course)) class Student(SchoolMember): #子類 """學生""" def __init__(self,name,age,sex,course,tuition): #包含基類並新建元素 SchoolMember.__init__(self,name,age,sex) #繼承基類構造 self.course = course self.tuition = tuition #fee學費 def pay_tuition(self,amount): print("student [%s] has just paied [%s]"%(self.name,amount)) self.amount += amount t1 = Teacher("Wusir","28","F*M","8000","Python") s1 = Student("HaiTao","38","N/A","PYS15",300000) s2 = Student("LiChuang",12,"M","PYS15",11000) print(t1.__dict__) #打印變量t1的元素信息。 #問題2.在不改寫子類的情況下,通過基類打印,不同子類的信息。 # t1.tell() # s1.tell() #執行結果 # -------info:Wusir--------- # name Wusir # age 28 # sex F*M # salary 8000 # course Python # # -------info:HaiTao--------- # name HaiTao # age 38 # sex N/A # course PYS15 # tuition 300000 #問題1,刪除成員後自動減註冊表。 # import time # del s2 # print(SchoolMember.member) # time.sleep(5) #執行結果: # 開除了[LiChuang]... #2 #開除了[Wusir]... #開除了[HaiTao]...
註:析構函數,程序執行完畢後會自動輸出。
Python 繼承