1. 程式人生 > >Python鴨子型別和多型

Python鴨子型別和多型

先看看程式碼,稍後我再分析

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
  1. 大家要理解 為什麼 可以 這樣寫a=Person, 類 函式可以作為物件, 之前文章有介紹過.

  2. python 的變數是沒有指定型別的, 拿來就直接賦型別就行了, 這就是 和靜態語言java 的區別. 缺點是不執行是不知道有問題的.

  3. [Person,Animal,Robot] 這個三個類一定要有同樣的方法 run, 才能實現 ,這就是 鴨子型別的概念

  4. “當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。” 實際他是不關心你是不是鴨子,我只看你會不會像鴨子走路, 叫,游泳. 都會歸為一類. 都可以呼叫共同的方法,或者屬性.

  5. 如果對這個例子不太理解我再舉個簡單例子 如下

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']