Py003-01-06多态与多态性

多态

同类事物有多种形态

  • 动物的几种形态,人狗猪三种形态
  • 游戏里角色的几种形态,法师战士弓箭手

多态性

在不考虑实例类型的情况下,直接使用实例

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程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

你所学的序列类型

  • 列表list
  • 元组tuple
  • 字符串str
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

如果你不是一个优秀的人,你就假装你是一个优秀的人(模仿优秀的人做的事),久而久之你也变成了一个优秀的人。