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設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例
這篇文章主要介紹了Python設(shè)計(jì)實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了Python3.5實(shí)現(xiàn)計(jì)算器功能的正則、字符串及數(shù)值運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
通過(guò)Python實(shí)現(xiàn)自動(dòng)填寫(xiě)調(diào)查問(wèn)卷
這篇文章主要介紹了通過(guò)Python實(shí)現(xiàn)自動(dòng)填寫(xiě)調(diào)查問(wèn)卷的相關(guān)資料,需要的朋友可以參考下2017-09-09
python腳本實(shí)現(xiàn)將excel表格數(shù)據(jù)拆分成兩個(gè)文件
這篇文章主要為大家詳細(xì)介紹了如何用python腳本把一個(gè)表格有4萬(wàn)多條數(shù)據(jù)分為兩個(gè)文件表,每個(gè)2萬(wàn)條數(shù)據(jù),文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2025-04-04
Python使用單例模式創(chuàng)建類(lèi)的實(shí)現(xiàn)示例
本文詳細(xì)介紹了Python中實(shí)現(xiàn)單例模式的多種方式,包括元類(lèi)、threading.Lock、模塊、importlib、__new__方法和裝飾器等,感興趣的可以了解一下2024-12-12
Python中使用haystack實(shí)現(xiàn)django全文檢索搜索引擎功能
django是python語(yǔ)言的一個(gè)web框架,功能強(qiáng)大。配合一些插件可為web網(wǎng)站很方便地添加搜索功能。下面通過(guò)本文給大家分享Python中使用haystack實(shí)現(xiàn)django全文檢索搜索引擎功能,感興趣的朋友一起看看吧2017-08-08
python numpy數(shù)組復(fù)制使用實(shí)例解析
這篇文章主要介紹了python numpy數(shù)組復(fù)制使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python中random.choice()函數(shù)的使用
random.choice()?是 Python 標(biāo)準(zhǔn)庫(kù)?random?模塊中的一個(gè)函數(shù),用于從一個(gè)?非空序列?中?隨機(jī)選擇一個(gè)元素,本文主要介紹了Python中random.choice()函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04

