Python類(lèi)的繼承和多態(tài)代碼詳解
Python類(lèi)的繼承
在OOP(ObjectOrientedProgramming)程序設(shè)計(jì)中,當(dāng)我們定義一個(gè)class的時(shí)候,可以從某個(gè)現(xiàn)有的class繼承,新的class稱(chēng)為子類(lèi)(Subclass),而被繼承的class稱(chēng)為基類(lèi)、父類(lèi)或超類(lèi)(Baseclass、Superclass)。
我們先來(lái)定義一個(gè)classPerson,表示人,定義屬性變量name及sex(姓名和性別);
定義一個(gè)方法print_title():當(dāng)sex是male時(shí),printman;當(dāng)sex是female時(shí),printwoman。參考如下代碼:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex) # 子類(lèi)繼承父類(lèi)方法及屬性
May.print_title()
Peter.print_title()
而我們編寫(xiě)Child類(lèi),完全可以繼承Person類(lèi)(Child就是Person);使用classsubclass_name(baseclass_name)來(lái)表示繼承;
繼承有什么好處?最大的好處是子類(lèi)獲得了父類(lèi)的全部屬性及功能。如下Child類(lèi)就可以直接使用父類(lèi)的print_title()方法
實(shí)例化Child的時(shí)候,子類(lèi)繼承了父類(lèi)的構(gòu)造函數(shù),就需要提供父類(lèi)Person要求的兩個(gè)屬性變量name及sex:
在繼承關(guān)系中,如果一個(gè)實(shí)例的數(shù)據(jù)類(lèi)型是某個(gè)子類(lèi),那它也可以被看做是父類(lèi)(May既是Child又是Person)。但是,反過(guò)來(lái)就不行(Peter僅是Person,而不是Child)。
繼承還可以一級(jí)一級(jí)地繼承下來(lái),就好比從爺爺?shù)桨职?、再到兒子這樣的關(guān)系。而任何類(lèi),最終都可以追溯到根類(lèi)object,這些繼承關(guān)系看上去就像一顆倒著的樹(shù)。比如如下的繼承樹(shù):

isinstance()及issubclass()
Python與其他語(yǔ)言不同點(diǎn)在于,當(dāng)我們定義一個(gè)class的時(shí)候,我們實(shí)際上就定義了一種數(shù)據(jù)類(lèi)型。我們定義的數(shù)據(jù)類(lèi)型和Python自帶的數(shù)據(jù)類(lèi)型,比如str、list、dict沒(méi)什么兩樣。
Python有兩個(gè)判斷繼承的函數(shù):isinstance()用于檢查實(shí)例類(lèi)型;issubclass()用于檢查類(lèi)繼承。參見(jiàn)下方示例:
class Person(object): pass class Child(Person): # Child 繼承 Person pass May = Child() Peter = Person() print(isinstance(May,Child)) # True print(isinstance(May,Person)) # True print(isinstance(Peter,Child)) # False print(isinstance(Peter,Person)) # True print(issubclass(Child,Person)) # True
Python類(lèi)的多態(tài)
在說(shuō)明多態(tài)是什么之前,我們?cè)贑hild類(lèi)中重寫(xiě)print_title()方法:若為male,printboy;若為female,printgirl
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
當(dāng)子類(lèi)和父類(lèi)都存在相同的print_title()方法時(shí),子類(lèi)的print_title()覆蓋了父類(lèi)的print_title(),在代碼運(yùn)行時(shí),會(huì)調(diào)用子類(lèi)的print_title()
這樣,我們就獲得了繼承的另一個(gè)好處:多態(tài)。
多態(tài)的好處就是,當(dāng)我們需要傳入更多的子類(lèi),例如新增Teenagers、Grownups等時(shí),我們只需要繼承Person類(lèi)型就可以了,而print_title()方法既可以直不重寫(xiě)(即使用Person的),也可以重寫(xiě)一個(gè)特有的。這就是多態(tài)的意思。調(diào)用方只管調(diào)用,不管細(xì)節(jié),而當(dāng)我們新增一種Person的子類(lèi)時(shí),只要確保新方法編寫(xiě)正確,而不用管原來(lái)的代碼。這就是著名的“開(kāi)閉”原則:
對(duì)擴(kuò)展開(kāi)放(Openforextension):允許子類(lèi)重寫(xiě)方法函數(shù)
對(duì)修改封閉(Closedformodification):不重寫(xiě),直接繼承父類(lèi)方法函數(shù)
子類(lèi)重寫(xiě)構(gòu)造函數(shù)
子類(lèi)可以沒(méi)有構(gòu)造函數(shù),表示同父類(lèi)構(gòu)造一致;子類(lèi)也可重寫(xiě)構(gòu)造函數(shù);現(xiàn)在,我們需要在子類(lèi)Child中新增兩個(gè)屬性變量:mother和father,我們可以構(gòu)造如下(建議子類(lèi)調(diào)用父類(lèi)的構(gòu)造方法,參見(jiàn)后續(xù)代碼):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
Person
若父類(lèi)構(gòu)造函數(shù)包含很多屬性,子類(lèi)僅需新增1、2個(gè),會(huì)有不少冗余的代碼,這邊,子類(lèi)可對(duì)父類(lèi)的構(gòu)造方法進(jìn)行調(diào)用,參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex) # 子類(lèi)對(duì)父類(lèi)的構(gòu)造方法的調(diào)用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
多重繼承
多重繼承的概念應(yīng)該比較好理解,比如現(xiàn)在需要新建一個(gè)類(lèi)baby繼承Child,可繼承父類(lèi)及父類(lèi)上層類(lèi)的屬性及方法,優(yōu)先使用層類(lèi)近的方法,代碼參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female") # 繼承上上層父類(lèi)的屬性
print(May.name,May.sex)
May.print_title() # 可使用上上層父類(lèi)的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title() # 優(yōu)先使用上層類(lèi)的方法
總結(jié)
以上就是本文關(guān)于Python類(lèi)的繼承和多態(tài)代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
python實(shí)現(xiàn)新年倒計(jì)時(shí)實(shí)例代碼
大家好,本篇文章主要講的是python實(shí)現(xiàn)新年倒計(jì)時(shí)實(shí)例代碼,昂星期的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽2021-12-12
python使用opencv對(duì)圖像mask處理的方法
這篇文章主要介紹了python使用opencv對(duì)圖像mask處理的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
使用原生Python編寫(xiě)Hadoop?MapReduce程序
在大數(shù)據(jù)處理領(lǐng)域,Hadoop?MapReduce是一個(gè)廣泛使用的框架,用于處理和生成大規(guī)模數(shù)據(jù)集,本文將使用原生Python編寫(xiě)Hadoop?MapReduce程序,需要的可以參考下2025-02-02
Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案
小編在使用opencv讀取帶有中文路徑的圖片時(shí),發(fā)現(xiàn)會(huì)出現(xiàn)亂碼的情況,當(dāng)讀取的文件路徑出現(xiàn)中文時(shí),(文件夾名為中文或者文件為中文)出現(xiàn)錯(cuò)誤,所以本文給大家介紹了Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案,需要的朋友可以參考下2024-06-06
Windows系統(tǒng)下PhantomJS的安裝和基本用法
今天小編就為大家分享一篇關(guān)于Windows系統(tǒng)下PhantomJS的安裝和基本用法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
python dataframe astype 字段類(lèi)型轉(zhuǎn)換方法
下面小編就為大家分享一篇python dataframe astype 字段類(lèi)型轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Python個(gè)人博客程序開(kāi)發(fā)實(shí)例框架設(shè)計(jì)
這篇文章主要介紹了怎樣用Java來(lái)實(shí)現(xiàn)一個(gè)完整的個(gè)人博客系統(tǒng),我們通過(guò)實(shí)操上手的方式可以高效的鞏固所學(xué)的基礎(chǔ)知識(shí),感興趣的朋友一起來(lái)看看吧2022-12-12

