python 多態 協議詳解

這篇文章主要爲大家介紹了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++中的純虛函數類

這個類只能當做協議(接口)類

本文地址:https://www.linuxprobe.com/python-polymorphic-protocol.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章