您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“python面向?qū)ο笾惖睦^承怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“python面向?qū)ο笾惖睦^承怎么實(shí)現(xiàn)”吧!
面向?qū)ο缶幊?(OOP) 語言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進(jìn)行擴(kuò)展。
通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”,繼承的過程,就是從一般到特殊的過程。在某些 OOP 語言中,一個(gè)子類可以繼承多個(gè)基類。但是一般情況下,一個(gè)子類只能有一個(gè)基類,要實(shí)現(xiàn)多重繼承,可以通過多級繼承來實(shí)現(xiàn)。
繼承概念的實(shí)現(xiàn)方式主要有2類:實(shí)現(xiàn)繼承、接口繼承。
實(shí)現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力。接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力(子類重構(gòu)爹類方法)。
在考慮使用繼承時(shí),有一點(diǎn)需要注意,那就是兩個(gè)類之間的關(guān)系應(yīng)該是“屬于”關(guān)系。例如,Employee 是一個(gè)人,Manager 也是一個(gè)人,因此這兩個(gè)類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因?yàn)橥炔⒉皇且粋€(gè)人。
OO開發(fā)范式大致為:劃分對象→抽象類→將類組織成為層次化結(jié)構(gòu)(繼承和合成) →用類與實(shí)例進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)幾個(gè)階段。
class Person(object): # 定義一個(gè)父類 def talk(self): # 父類中的方法 print("person is talking....") class Chinese(Person): # 定義一個(gè)子類, 繼承Person類 def walk(self): # 在子類中定義其自身的方法 print("is walking...") c = Chinese() c.talk() # 調(diào)用繼承的Person類的方法 c.walk() # 調(diào)用本身的方法 # 輸出 person is talking.... is walking...
如果我們要給實(shí)例 c 傳參,我們就要使用到構(gòu)造函數(shù),那么構(gòu)造函數(shù)該如何繼承,同時(shí)子類中又如何定義自己的屬性?
繼承類的構(gòu)造方法:
1.經(jīng)典類的寫法: 父類名稱.__init__(self,參數(shù)1,參數(shù)2,...)
2. 新式類的寫法:super(子類,self).__init__(參數(shù)1,參數(shù)2,....)
class Person(object): def __init__(self, name, age): self.name = name self.age = age self.weight = "weight" def talk(self): print("person is talking....") class Chinese(Person): def __init__(self, name, age, language): # 先繼承,在重構(gòu) Person.__init__(self, name, age) #繼承父類的構(gòu)造方法,也可以寫成:super(Chinese,self).__init__(name,age) self.language = language # 定義類的本身屬性 def walk(self): print("is walking...") class American(Person): pass c = Chinese("bigberg", 22, "Chinese")
如果我們只是簡單的在子類Chinese中定義一個(gè)構(gòu)造函數(shù),其實(shí)就是在重構(gòu)。這樣子類就不能繼承父類的屬性了。所以我們在定義子類的構(gòu)造函數(shù)時(shí),要先繼承再構(gòu)造,這樣我們也能獲取父類的屬性了。
子類構(gòu)造函數(shù)基礎(chǔ)父類構(gòu)造函數(shù)過程如下:
實(shí)例化對象c ----> c 調(diào)用子類__init__() ---- > 子類__init__()繼承父類__init__() ----- > 調(diào)用父類__init__()
如果我們對基類/父類的方法需要修改,可以在子類中重構(gòu)該方法。如下的talk()方法
class Person(object): def __init__(self, name, age): self.name = name self.age = age self.weight = "weight" def talk(self): print("person is talking....") class Chinese(Person): def __init__(self, name, age, language): Person.__init__(self, name, age) self.language = language print(self.name, self.age, self.weight, self.language) def talk(self): # 子類 重構(gòu)方法 print("%s is speaking chinese" % self.name) def walk(self): print("is walking...") c = Chinese("bigberg", 22, "Chinese") c.talk() # 輸出 bigberg 22 weight Chinese bigberg is speaking chinese
class SchoolMember(object): """學(xué)習(xí)成員基類""" member = 0 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex self.enroll() def enroll(self): "注冊" print("just enrolled a new school member [%s]." % self.name) SchoolMember.member += 1 def tell(self): print("----%s----" % self.name) for k, v in self.__dict__.items(): print(k, v) print("----end-----") def __del__(self): print("開除了[%s]" % self.name) SchoolMember.member -= 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 teaching(self): print("Teacher [%s] is teaching [%s]" % (self.name, self.course)) class Student(SchoolMember): "學(xué)生" def __init__(self, name, age, sex, course, tuition): SchoolMember.__init__(self, name, age, sex) self.course = course self.tuition = tuition self.amount = 0 def pay_tuition(self, amount): print("student [%s] has just paied [%s]" % (self.name, amount)) self.amount += amount t1 = Teacher("Wusir", 28, "M", 3000, "python") t1.tell() s1 = Student("haitao", 38, "M", "python", 30000) s1.tell() s2 = Student("lichuang", 12, "M", "python", 11000) print(SchoolMember.member) del s2 print(SchoolMember.member) # 輸出 ----end----- just enrolled a new school member [haitao]. ----haitao---- age 38 sex M name haitao amount 0 course python tuition 30000 ----end----- just enrolled a new school member [lichuang]. 3 開除了[lichuang] 2 開除了[Wusir] 開除了[haitao]
到此,相信大家對“python面向?qū)ο笾惖睦^承怎么實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。