Python面向?qū)ο箢?lèi)的繼承實(shí)例詳解
本文實(shí)例講述了Python面向?qū)ο箢?lèi)的繼承。分享給大家供大家參考,具體如下:
一、概述
面向?qū)ο缶幊?(OOP) 語(yǔ)言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
通過(guò)繼承創(chuàng)建的新類(lèi)稱(chēng)為“子類(lèi)”或“派生類(lèi)”,被繼承的類(lèi)稱(chēng)為“基類(lèi)”、“父類(lèi)”或“超類(lèi)”,繼承的過(guò)程,就是從一般到特殊的過(guò)程。在某些 OOP 語(yǔ)言中,一個(gè)子類(lèi)可以繼承多個(gè)基類(lèi)。但是一般情況下,一個(gè)子類(lèi)只能有一個(gè)基類(lèi),要實(shí)現(xiàn)多重繼承,可以通過(guò)多級(jí)繼承來(lái)實(shí)現(xiàn)。
繼承概念的實(shí)現(xiàn)方式主要有2類(lèi):實(shí)現(xiàn)繼承、接口繼承。
實(shí)現(xiàn)繼承是指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力。
接口繼承是指僅使用屬性和方法的名稱(chēng)、但是子類(lèi)必須提供實(shí)現(xiàn)的能力(子類(lèi)重構(gòu)爹類(lèi)方法)。
在考慮使用繼承時(shí),有一點(diǎn)需要注意,那就是兩個(gè)類(lèi)之間的關(guān)系應(yīng)該是“屬于”關(guān)系。例如,Employee 是一個(gè)人,Manager 也是一個(gè)人,因此這兩個(gè)類(lèi)都可以繼承 Person 類(lèi)。但是 Leg 類(lèi)卻不能繼承 Person 類(lèi),因?yàn)橥炔⒉皇且粋€(gè)人。
OO開(kāi)發(fā)范式大致為:劃分對(duì)象→抽象類(lèi)→將類(lèi)組織成為層次化結(jié)構(gòu)(繼承和合成) →用類(lèi)與實(shí)例進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)幾個(gè)階段。
二、類(lèi)的繼承
2.1 繼承的定義
class Person(object): # 定義一個(gè)父類(lèi) def talk(self): # 父類(lèi)中的方法 print("person is talking....") class Chinese(Person): # 定義一個(gè)子類(lèi), 繼承Person類(lèi) def walk(self): # 在子類(lèi)中定義其自身的方法 print('is walking...') c = Chinese() c.talk() # 調(diào)用繼承的Person類(lèi)的方法 c.walk() # 調(diào)用本身的方法
輸出:
person is talking....
is walking...
2.2 構(gòu)造函數(shù)的繼承
如果我們要給實(shí)例 c 傳參,我們就要使用到構(gòu)造函數(shù),那么構(gòu)造函數(shù)該如何繼承,同時(shí)子類(lèi)中又如何定義自己的屬性?
繼承類(lèi)的構(gòu)造方法:
1.經(jīng)典類(lèi)的寫(xiě)法: 父類(lèi)名稱(chēng).__init__(self,參數(shù)1,參數(shù)2,...)
2. 新式類(lèi)的寫(xiě)法:super(子類(lèi),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) #繼承父類(lèi)的構(gòu)造方法,也可以寫(xiě)成:super(Chinese,self).__init__(name,age) self.language = language # 定義類(lèi)的本身屬性 def walk(self): print('is walking...') class American(Person): pass c = Chinese('bigberg', 22, 'Chinese')
如果我們只是簡(jiǎn)單的在子類(lèi)Chinese中定義一個(gè)構(gòu)造函數(shù),其實(shí)就是在重構(gòu)。這樣子類(lèi)就不能繼承父類(lèi)的屬性了。所以我們?cè)诙x子類(lèi)的構(gòu)造函數(shù)時(shí),要先繼承再構(gòu)造,這樣我們也能獲取父類(lèi)的屬性了。
子類(lèi)構(gòu)造函數(shù)基礎(chǔ)父類(lèi)構(gòu)造函數(shù)過(guò)程如下:
實(shí)例化對(duì)象c ----> c 調(diào)用子類(lèi)__init__() ---- > 子類(lèi)__init__()繼承父類(lèi)__init__() ----- > 調(diào)用父類(lèi) __init__()
2.3 子類(lèi)對(duì)父類(lèi)方法的重寫(xiě)
如果我們對(duì)基類(lèi)/父類(lèi)的方法需要修改,可以在子類(lèi)中重構(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): # 子類(lèi) 重構(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
三、類(lèi)繼承的事例
class SchoolMember(object): '''學(xué)習(xí)成員基類(lèi)''' member = 0 def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex self.enroll() def enroll(self): '注冊(cè)' 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('開(kāi)除了[%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
開(kāi)除了[lichuang]
2
開(kāi)除了[Wusir]
開(kāi)除了[haitao]
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python入門(mén)篇之面向?qū)ο?/a>
- Python面向?qū)ο笾蓄?lèi)(class)的簡(jiǎn)單理解與用法分析
- Python面向?qū)ο笾?lèi)和對(duì)象實(shí)例詳解
- Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐
- Python 面向?qū)ο?成員的訪(fǎng)問(wèn)約束
- Python面向?qū)ο髮?shí)現(xiàn)一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象操作示例
- Python3.5面向?qū)ο缶幊虉D文與實(shí)例詳解
- Python中的面向?qū)ο缶幊淘斀?上)
- Python?面向?qū)ο缶幊淘斀?/a>
相關(guān)文章
python調(diào)用文字識(shí)別OCR輕松搞定驗(yàn)證碼
本文主要介紹了python調(diào)用文字識(shí)別OCR輕松搞定驗(yàn)證碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Python獲取接口請(qǐng)求耗時(shí)的方法詳解
你想知道我們請(qǐng)求一個(gè)url的時(shí)候,握手和請(qǐng)求資源分別占用多長(zhǎng)時(shí)間么?今天我們就來(lái)使用python寫(xiě)個(gè)小案例來(lái)看看,感興趣的可以跟隨小編一起了解一下2023-04-04國(guó)產(chǎn)化設(shè)備鯤鵬CentOS7上源碼安裝Python3.7的過(guò)程詳解
這篇文章主要介紹了國(guó)產(chǎn)化設(shè)備鯤鵬CentOS7上源碼安裝Python3.7,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05關(guān)于Python中request發(fā)送post請(qǐng)求傳遞json參數(shù)的問(wèn)題
這篇文章主要介紹了Python中request發(fā)送post請(qǐng)求傳遞json參數(shù)的問(wèn)題,在Python中需要傳遞dict參數(shù),利用json.dumps將dict轉(zhuǎn)為json格式用post方法發(fā)起請(qǐng)求,感興趣的朋友跟隨小編一起看看吧2022-08-08Python實(shí)現(xiàn)Harbor私有鏡像倉(cāng)庫(kù)垃圾自動(dòng)化清理詳情
這篇文章主要介紹了Python實(shí)現(xiàn)Harbor私有鏡像倉(cāng)庫(kù)垃圾自動(dòng)化清理詳情,文章圍繞主題分享相關(guān)詳細(xì)代碼,需要的小伙伴可以參考一下2022-05-05Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的遞歸下降分析器
這篇文章主要介紹了Python如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的遞歸下降分析器,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08