Python教程之Python多態(tài)的深層次理解
前言:
多態(tài)的實(shí)現(xiàn)必須滿(mǎn)足兩個(gè)前提條件
- 1.繼承:多態(tài)一定是發(fā)生在子類(lèi)和父類(lèi)之間
- 2.重寫(xiě):多態(tài)子類(lèi)重寫(xiě)了父類(lèi)的方法
記住這兩點(diǎn)再結(jié)合代碼示例有助于理解多態(tài)
#多態(tài)的代碼實(shí)例 class Farther: def behavior(self,action): print("父親會(huì)%s" % action) # 定義Son類(lèi)繼承Farther類(lèi) class Son(Farther): def behavior(self,action): print("兒子會(huì)%s" % action) # 定義Grandson類(lèi)繼承Farther類(lèi) class Grandson(Farther): def behavior(self,action): print("孫子會(huì)%s" % action) # 使用Farter類(lèi)創(chuàng)建對(duì)象 # 程序在執(zhí)行時(shí)才會(huì)確定behavior方法是屬于哪一個(gè)對(duì)象的 f = Farther() print(id(f)) f.behavior("吃飯") #父親會(huì)吃飯 f = Son() print(id(f)) f.behavior("吃飯") #兒子會(huì)吃飯 f = Grandson() print(id(f)) f.behavior("吃飯") #孫子會(huì)吃飯
運(yùn)行結(jié)果:
1603040478928
父親會(huì)吃飯
1603040477584
孫子會(huì)吃飯
1603040478928
兒子會(huì)吃飯
從以上代碼示例可以看出,Son,Grandson這兩個(gè)子類(lèi)都繼承了Farther類(lèi),且都重寫(xiě)了父類(lèi)中的behavior方法;由此結(jié)果可見(jiàn),同一個(gè)對(duì)象調(diào)用同一個(gè)(參數(shù),函數(shù)名完全相同)behavior方法時(shí),由于f指向的的實(shí)例對(duì)象不同,程序在實(shí)際運(yùn)行時(shí)調(diào)用的并不是同一個(gè)behavior()方法,代碼會(huì)自動(dòng)根據(jù)p的具體對(duì)象來(lái)決定執(zhí)行哪個(gè)behavior方法,這就是多態(tài)性
# 多態(tài)的應(yīng)用 class IceCream: def make_icecream(self,taste): print("尋找不同口味的冰淇淋...") taste.make(self) # 定義抹茶味的冰淇淋和方法 class Tea: def make(self,make_icecream): print('%s 正在調(diào)用抹茶的制作方法' % make_icecream) class Orange: def make(self,make_icecream): print('%s 正在調(diào)用抹茶的制作方法' % make_icecream) class Apple: def make(self,make_icecream): print('%s 正在調(diào)用抹茶的制作方法' % make_icecream) i = IceCream() # 抹茶味 i.make_icecream(Tea()) # 橘子味 i.make_icecream(Orange()) #蘋(píng)果味 i.make_icecream(Apple())
# 執(zhí)行結(jié)果
尋找不同口味的冰淇淋...
<__main__.IceCream object at 0x000002700CF086D0> 正在調(diào)用抹茶的制作方法
尋找不同口味的冰淇淋...
<__main__.IceCream object at 0x000002700CF086D0> 正在調(diào)用抹茶的制作方法
尋找不同口味的冰淇淋...
<__main__.IceCream object at 0x000002700CF086D0> 正在調(diào)用抹茶的制作方法
解析:
從上述代碼可見(jiàn),在調(diào)用IceCream類(lèi)的make_icecream()方法時(shí),程序并不關(guān)心為該方法傳入的參數(shù)對(duì)象taste是誰(shuí),只要求此參數(shù)對(duì)象taste包含make()方法即可,而調(diào)用者傳入的參數(shù)對(duì)象類(lèi)型taste是子類(lèi)還是其他類(lèi),Python并不在乎!
總結(jié)一句話(huà)就是:多態(tài)中不同的子類(lèi)對(duì)象調(diào)用相同的父類(lèi)方法,會(huì)產(chǎn)生不同的執(zhí)行結(jié)果
這里的多態(tài)性是指具有不同功能的函數(shù)可以使用相同的函數(shù)名,這樣就可以用一個(gè)函數(shù)名調(diào)用不同內(nèi)容的函數(shù)。
class Wechatpay: def __init__(self, name, money): self.name = name self.money = money def pay(self): print('%s通過(guò)微信支付了%s元' % (self.name, self.money)) class Alipay: def __init__(self, name, money): self.name = name self.money = money def pay(self): print('%s通過(guò)支付寶支付了%s元' % (self.name, self.money)) #這里的多態(tài)性體現(xiàn)是向同一個(gè)函數(shù),傳遞不同參數(shù)后,可以實(shí)現(xiàn)不同功能. def pay(person): person.pay() # 實(shí)列化對(duì)象 ali = Alipay("xiaoming", 100) wch = Alipay("xiaohong", 100) pay(ali) pay(wch)
以上就是Python教程之Python多態(tài)的深層次理解的詳細(xì)內(nèi)容,更多關(guān)于Python多態(tài)理解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 使用turtule繪制遞歸圖形(螺旋、二叉樹(shù)、謝爾賓斯基三角形)
這篇文章主要介紹了python 使用turtule繪制遞歸圖形(螺旋、二叉樹(shù)、謝爾賓斯基三角形) ,需要的朋友可以參考下2019-05-05Python 創(chuàng)建子進(jìn)程模塊subprocess詳解
這篇文章主要介紹了Python 創(chuàng)建子進(jìn)程模塊subprocess詳解,本文詳細(xì)講解了subprocess模塊的方法、參數(shù)、使用實(shí)例等,需要的朋友可以參考下2015-04-04python語(yǔ)言變量和數(shù)據(jù)類(lèi)型基礎(chǔ)學(xué)習(xí)
這篇文章主要為大家介紹了python語(yǔ)言變量和數(shù)據(jù)類(lèi)型基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密(推薦)
在Python中實(shí)現(xiàn)AES算法需要借助的第三方庫(kù)Crypto,其在各個(gè)操作系統(tǒng)上的安裝方法有些許復(fù)雜,所以對(duì)于簡(jiǎn)單的使用有點(diǎn)殺雞用牛刀的意思。這篇文章主要介紹了利用Python內(nèi)置方法實(shí)現(xiàn)字符串的秘鑰加解密,需要的朋友可以參考下2019-12-12pytorch GAN偽造手寫(xiě)體mnist數(shù)據(jù)集方式
今天小編就為大家分享一篇pytorch GAN偽造手寫(xiě)體mnist數(shù)據(jù)集方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python利用thrift服務(wù)讀取hbase數(shù)據(jù)的方法
今天小編就為大家分享一篇python利用thrift服務(wù)讀取hbase數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python 三種方法實(shí)現(xiàn)對(duì)Excel表格的讀寫(xiě)
這篇文章主要介紹了python 三種方法實(shí)現(xiàn)對(duì)Excel表格的讀寫(xiě),幫助大家更好的利用python處理表格,感興趣的朋友可以了解下2020-11-11Python?pygame新手入門(mén)基礎(chǔ)教程
大家都知道pygame是跨平臺(tái)Python模塊,專(zhuān)為電子游戲設(shè)計(jì),包含圖像、聲音,這篇文章主要給大家介紹了關(guān)于Python?pygame新手入門(mén)基礎(chǔ)教程的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07