多态
同类事物有多种形态
- 动物的几种形态,人狗猪三种形态
- 游戏里角色的几种形态,法师战士弓箭手
多态性
在不考虑实例类型的情况下,直接使用实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import abc class Animal(metaclass=abc.ABCMeta): category = 'animal' @abc.abstractmethod def run(self): pass
class People(Animal): def run(self): print('人 跑')
class Pig(Animal): def run(self): print('猪 跑')
class Dog(Animal): def run(self): print('狗 跑')
# 多态性:在不考虑实例类型的情况下,直接使用实例 people = People() dog = Dog() pig = Pig()
# 它们都能 调用对应的 run方法 ''' people.run() dog.run() pig.run() '''
# 统一的形式去调用,增加程序的灵活性 def commonRun(animal): animal.run()
commonRun(people) commonRun(pig) commonRun(dog)
|
为啥用多态性
1.增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如commonRun(animal)
2.增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用commonRun(animal)去调用
1 2 3
| class Cat(Animal): def run(self): print('猫 跑')
|
鸭子类型
Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
你所学的序列类型
1 2 3 4 5 6 7 8 9 10 11 12 13
| l = list([1,2,3]) t = tuple(('a','b')) s = str('hello')
# 此时都有len方法 你需要考虑它是 list tuple str吗? print(l.__len__()) print(t.__len__()) print(s.__len__())
''' def len(obj): return obj.__len__() '''
|
所以说你看着像鸭子,没准你就真的是鸭子
学习也是一样
fake it until you make it
如果你不是一个优秀的人,你就假装你是一个优秀的人(模仿优秀的人做的事),久而久之你也变成了一个优秀的人。