什么是鴨子類型?
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__ 方法,其實例化的對象就可以變成可迭代對象