python?多態(tài)?協(xié)議?鴨子類型詳解
接口(python 中的協(xié)議)的多種不同的實現(xiàn)方式即為多態(tài)。多態(tài)的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調(diào)用。
from abc import ABCMeta, abstractmethod
# 鴨子類
class Dock(metaclass=ABCMeta):
@abstractmethod
def Swimming(self): # 游泳方法協(xié)議(接口)
pass
@abstractmethod # 走路協(xié)議(接口)
def Walk(self):
pass
@classmethod
def __subclasshook__(cls, C):
# 判斷是否另一個比較類是否實現(xiàn)了 Swimming Walk 協(xié)議, 如果實現(xiàn)了鴨子類的這兩個協(xié)議,
# 那么比較類的類型就是一個鴨子類型
# 當(dāng)代碼執(zhí)行中如果執(zhí)行到對象和這個類進行 isinstance 類型判斷時會走到這個函數(shù)進行判斷
for method in ('Swimming', 'Walk'):
for B in C.__mro__:
if method in B.__dict__:
if B.__dict__[method] is None:
return NotImplemented
break
else:
return NotImplemented
return True
# 狗類
class Dog(object):
# 實現(xiàn)swimming 協(xié)議
def Swimming(self):
print("狗會狗刨")
# 實現(xiàn)walk 協(xié)議
def Walk(self):
print("狗會走路")
def Eat(self):
print("狗喜歡吃骨頭")
# 烏龜類
class Tortoise(object):
# 實現(xiàn)swimming 協(xié)議
def Swimming(self):
print("烏龜會潛水")
# 實現(xiàn)walk 協(xié)議
def Walk(self):
print("烏龜會走路")
def Eat(self):
print("烏龜喜歡吃魚")
dog = Dog()
tortoise = Tortoise()
print(isinstance(dog, Dock)) # True
print(isinstance(tortoise, Dock)) # True
可以看到,在上面的代碼中,只要實現(xiàn)了 Dock 類中的 swimming 和 Walk 方法,那么這個類就可以被叫做 Dock 類
應(yīng)用場景 如: for 循環(huán), 在python 中 for 循環(huán)只能用于可迭代對象, 那么, 我自己定義的類實現(xiàn)了 __iter__協(xié)議(接口),這個實例類就是一個可迭代對象,可以被for 循環(huán)使用
python 中定義協(xié)議類協(xié)議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過的類是不能進行初始化的,相對于c++中的純虛函數(shù)類
這個類只能當(dāng)做協(xié)議(接口)類
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python Tcp協(xié)議發(fā)送和接收信息的例子
今天小編就為大家分享一篇python Tcp協(xié)議發(fā)送和接收信息的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python使用Selenium+BeautifulSoup爬取淘寶搜索頁
這篇文章主要為大家詳細介紹了Python使用Selenium+BeautifulSoup爬取淘寶搜索頁,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法
本篇文章主要介紹了python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
解決在Python編輯器pycharm中程序run正常debug錯誤的問題
今天小編就為大家分享一篇解決在Python編輯器pycharm中程序run正常debug錯誤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01

