溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python多態(tài)協(xié)議鴨子類型分析

發(fā)布時間:2021-11-30 09:58:27 來源:億速云 閱讀:148 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“python多態(tài)協(xié)議鴨子類型分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

接口(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é)議,
        # 那么比較類的類型就是一個鴨子類型
        # 當代碼執(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 類

應用場景 如: for 循環(huán), 在python 中 for 循環(huán)只能用于可迭代對象, 那么, 我自己定義的類實現(xiàn)了 __iter__協(xié)議(接口),這個實例類就是一個可迭代對象,可以被for 循環(huán)使用

python 中定義協(xié)議類協(xié)議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過的類是不能進行初始化的,相對于c++中的純虛函數(shù)類
這個類只能當做協(xié)議(接口)類

“python多態(tài)協(xié)議鴨子類型分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI