持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
1. 多态
面向对象三大特性:
- 封装:根据职责将属性和方法封装到同一个抽象的类中
- 注意类的设计准则
- 继承:实现代码的重用,相同的代码不需要重复的编写
- 设计类的技巧
- 子类针对自己特有的需求,编写特定的代码
- 多态:不同的子类对象调用相同的父类方法,产生不同的执行结果
- 多态可以增加代码的灵活度
- 以继承和重写父类方法为前提
- 是调用方法的技巧,不会影响类的内部设计
2. 案例演练
需求分析:
- 在Dog类中封装方法game
- 普通狗只是简单的玩耍
- 定义XiaoTianDog继承自Dog,并重写game方法
- 哮天犬需要在天上玩耍
- 定义Person类,并且封装一个和狗完的方法
- 在方法内部,直接让狗对象调用game方法 代码示例如下所示:
class Dog(object):
def __init__(self, name):
self.name = name
def game(self):
print("%s蹦蹦跳跳的玩耍..." % self.name)
class XiaoTianDog(Dog):
def game(self):
print("%s 飞到天上去玩耍..." % self.name)
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print("%s和%s快乐的玩耍..." % (self.name, dog.name))
# 让狗玩耍
dog.game()
# 1. 创建一个狗对象
# wangcai = Dog("旺财")
wangcai = XiaoTianDog("飞天旺财")
# 2. 创建一个小明对象
xiaoming = Person("小明")
# 3. 让小明调用和狗玩的方法
xiaoming.game_with_dog(wangcai)
运行结果如下图所示:
当用Dog创建对象wangcai时,取消代码中注释部分,并将XiaoTianDog创建的对象注释掉,运行结果如下图所示:
因此,Person类中只需要让狗对象调用game方法,而不关心具体是什么狗。game方法是在Dog父类或者XiaoTianDog父类定义的。在程序执行时,传入不同的狗对象实参,就会产生不同的执行效果。