本篇內容介紹了“python多態協議鴨子類型分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
接口(python 中的協議)的多種不同的實現方式即為多態。多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。
from abc import ABCMeta, abstractmethod # 鴨子類 class Dock(metaclass=ABCMeta): @abstractmethod def Swimming(self): # 游泳方法協議(接口) pass @abstractmethod # 走路協議(接口) def Walk(self): pass @classmethod def __subclasshook__(cls, C): # 判斷是否另一個比較類是否實現了 Swimming Walk 協議, 如果實現了鴨子類的這兩個協議, # 那么比較類的類型就是一個鴨子類型 # 當代碼執行中如果執行到對象和這個類進行 isinstance 類型判斷時會走到這個函數進行判斷 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): # 實現swimming 協議 def Swimming(self): print("狗會狗刨") # 實現walk 協議 def Walk(self): print("狗會走路") def Eat(self): print("狗喜歡吃骨頭") # 烏龜類 class Tortoise(object): # 實現swimming 協議 def Swimming(self): print("烏龜會潛水") # 實現walk 協議 def Walk(self): print("烏龜會走路") def Eat(self): print("烏龜喜歡吃魚") dog = Dog() tortoise = Tortoise() print(isinstance(dog, Dock)) # True print(isinstance(tortoise, Dock)) # True
可以看到,在上面的代碼中,只要實現了 Dock 類中的 swimming 和 Walk 方法,那么這個類就可以被叫做 Dock 類
應用場景 如: for 循環, 在python 中 for 循環只能用于可迭代對象, 那么, 我自己定義的類實現了 __iter__協議(接口),這個實例類就是一個可迭代對象,可以被for 循環使用
python 中定義協議類協議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過的類是不能進行初始化的,相對于c++中的純虛函數類
這個類只能當做協議(接口)類
“python多態協議鴨子類型分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。