深入理解 Python 類和對象(1) - 鴨子類型和多態(tài)

什么是鴨子類型?

class Duck:
    def say(self):
        print('I am a duck')


class Cat:
    def say(self):
        print('I am a cat')


class Dog:
    def say(self):
        print('I am a dog')


animal = Cat
animal().say()

Java 中實現(xiàn)多態(tài),需要繼承父類,并覆蓋父類中的方法。

Python 中實現(xiàn)多態(tài),不需要繼承任何東西,只需要實現(xiàn)共同的方法名就行了。比如上面代碼中,三個類共同實現(xiàn)了同一個方法,而且名稱一樣,那么這些類可以歸為一種類型,這樣的話在調(diào)用的時候便可以同時調(diào)用它們的say()方法。以此就達到了多態(tài)的效果。

animal_lst = [Duck, Cat, Dog]
for animal in animal_lst:
    animal().say()

>>>
輸出:
I am a cat
I am a duck
I am a cat
I am a dog

得益于 Python 的動態(tài)性,這一切的實現(xiàn)變得特別的簡單,不需要繼承和實現(xiàn)任何東西。

比如列表 (list) 的方法extend()對于其他 iterable 類型都可以。

def extend(iterable)
L.extend(iterable) -> None -- extend list by appending elements from the iterable
a = ['s','c','p']
b = ['r','e','w']
named_tuple = set()
named_tuple.add('q')
named_tuple.add('z')
named_tuple.add('o')

a.extend(b)
print(a)

a.extend(named_tuple)
print(a)

>>>

['s', 'c', 'p', 'r', 'e', 'w']
['s', 'c', 'p', 'r', 'e', 'w', 'q', 'z', 'o']

類中若實現(xiàn)了__getitem__ 方法,其實例化的對象就可以變成可迭代對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容