Python中的多态
当子类和父类都存在相同的 game()方法时,子类的 game() 覆盖了父类的 game(),在代码运行时,会调用子类的 game()。
这样,我们就获得了继承的另一个好处:多态。
多态的好处就是,当我们需要传入更多的子类,例如新增 XX Dog、YY Dog 等时,我们只需要继承 Dog 类型就可以了,而game()方法既可以直不重写(即使用Dog的),也可以重写一个特有的。这就是多态的意思。调用方只管调用,不管细节,而当我们新增一种Dog的子类时,只要确保新方法编写正确,而不用管原来的代码。这就是著名的“开闭”原则:
- 对扩展开放(Open for extension):允许子类重写方法函数
- 对修改封闭(Closed for modification):不重写,直接继承父类方法函数
# 代码
class Dog(object):
def __init__(self, name):
self.name = name
def game(self):
print("{}跳".format(self.name))
class XiaoTianDog(Dog):
# 方法重写
def game(self):
print("{}飞".format(self.name))
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print("{}和{}玩耍".format(self.name, dog.name))
# 创建Dog对象
Peter = Dog("皮特")
# 创建XiaoTianDog对象
wangcai = XiaoTianDog("旺财")
# 调用Dog里面的game方法
Peter.game()
# 调用XiaoTianDog里面的game方法
wangcai.game()
xiaoming = Person("小明")
xiaoming.game_with_dog(wangcai)
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
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
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
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
# 运行结果
皮特跳
旺财飞
小明和旺财玩耍
1
2
3
2
3
1
2
3
2
3
编辑 (opens new window)
上次更新: 2022/12/31, 16:52:27
- 01
- SpringCache基本配置类05-16
- 03
- Rpamis-security-原理解析12-13