Python鴨子型別和多型
阿新 • • 發佈:2018-11-10
先看看程式碼,稍後我再分析
class Person:
def run(self):
print("Person can run")
class Animal:
def run(self):
print("Animal can run")
class Robot:
def run(self):
print("Robot can run")
for i in [Person,Animal,Robot]:
i().run()
列印的結果;
Person can run Animal can run Robot can run
-
大家要理解 為什麼 可以 這樣寫a=Person, 類 函式可以作為物件, 之前文章有介紹過.
-
python 的變數是沒有指定型別的, 拿來就直接賦型別就行了, 這就是 和靜態語言java 的區別. 缺點是不執行是不知道有問題的.
-
[Person,Animal,Robot] 這個三個類一定要有同樣的方法 run, 才能實現 ,這就是 鴨子型別的概念
-
“當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。” 實際他是不關心你是不是鴨子,我只看你會不會像鴨子走路, 叫,游泳. 都會歸為一類. 都可以呼叫共同的方法,或者屬性.
-
如果對這個例子不太理解我再舉個簡單例子 如下
a=['Andy','Xiuwu','Maggie'] name_tuple=['Andy01','Xiuwu01','Maggie01'] name_set=set() name_set.add("Andy3") name_set.add("Xiuwu3") a.extend(name_tuple) print(a) #注意 extend 語法是 def extend(self, iterable): iterable 要是可迭代型別. 可沒有說 只是list 型別# ,是個總的型別要求可迭代. 所以思維要擴散. # iterable 隱藏呼叫了 __iter__ 和 __getitem__, 魔法函式, 所以魔法函式會改變物件的型別,這個要切記, 下邊我在舉個例子吧. class Person: def __init__(self,person_list): self.person_list=person_list def __getitem__(self, item): return self.person_list[item] #下邊我們就可以用 這個 迭代型別物件 看好了 name_tuple.extend(Person(a)) #說明 Person(a)這個是可迭代了型別, 由於類Person 呼叫了 getitem 魔法函式 導致的.
列印的結果如下 :
['Andy', 'Xiuwu', 'Maggie', 'Andy01', 'Xiuwu01', 'Maggie01']
['Andy01', 'Xiuwu01', 'Maggie01', 'Andy', 'Xiuwu', 'Maggie', 'Andy01', 'Xiuwu01', 'Maggie01']