07---多態與多態性
阿新 • • 發佈:2019-01-25
對象 序列類型 cat 活性 自己的 可擴展性 走起 多態 fun
多態與多態性
多態
- 多態:一種事物的多種形態,比如:動物有多種形態,人、狗、貓。
import abc class Animal(metaclass=abc.ABCMeta): # 同一類事物:動物 @abc.abstractmethod def run(self): pass @abc.abstractmethod def eat(self): pass class Person(Animal): # 動物形態之一:人 def run(self): print('在走') def eat(self): print('人吃飯') class Pig(Animal): # 動物形態之一:豬 def run(self): print('在跑') def eat(self): print('豬吃草') class Dog(Animal): # 動物形態之一:狗 def run(self): print('在跳') def eat(self): print('小狗吃肉') class Cat(Animal): # 動物形態之一:貓 def run(self): pass def eat(self): pass
多態性
- python本身就是支持多態性的。不考慮實例對象的類型,比如說python的 + ,字符串能相加。數字能相加,列表能相加。但是他們是不同的對象;還有len()。字符串有長度。列表有。元祖有,字典等都有。
- 靜態多態性、動態多態性。
- 不管對象是什麽類型。只要他實現了某個方法就行。
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def run(self): pass @abc.abstractmethod def eat(self): pass class Person(Animal): def run(self): print('在走') def eat(self): print('人吃飯') class Pig(Animal): def run(self): print('在跑') def eat(self): print('豬吃草') class Dog(Animal): def run(self): print('在跳') def eat(self): print('小狗吃肉') class Cat(Animal): def run(self): pass def eat(self): pass class Phone: def eat(self): print('我是手機對象,吃不得') person1 = Person() pig1 = Pig() dog1 = Dog() p = Phone() # 統一的接口 def func(animal): animal.eat() func(person1) func(pig1) func(dog1) func(p) ''' 人吃飯 豬吃草 小狗吃肉 我是手機對象,吃不得 '''
- 對於animal來說。它是func的一個參數,而卻代表著多種形態,動物。人。貓。狗。手機。
- 為什麽要使用多態性?
- 增加量程序的靈活性。以不變應萬變,不論對象千變萬變,使用者都是通過接口func(animal)去調用
- 增加量程序的可擴展性。新建的類Phone。只要他下面有eat方法,使用者可以完全不修改自己的代碼,和動物類一樣調用eat()方法。
鴨子類型
- 如果看起來像鴨子,走起來像鴨子,叫起來像鴨子,那它就是鴨子。
- 序列類型有多種形態:字符串,列表,元組,但他們直接沒有直接的繼承關系
# 序列類型:列表list 元祖tuple 字符串str l = list([1,2,3]) t = tuple(('a','b')) s = str('hello python') def len(obj): return obj.__len__() print(len(l)) print(len(t)) print(len(s))
07---多態與多態性