一、 多态
1.1 定义(重点)
多态 :不同的 子类对象 调用相同的 父类方法,产生不同的执行结果
- 多态 可以 增加代码的灵活度
- 以 继承 和 重写父类方法 为前提
- 是调用方法的技巧,不会影响到类的内部设计
1.2 实现步骤
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)。
- 定义:多态是一种使用对象的方式,子类重写父类方法,不同子类对象调用相同父类方法,可以产生不同的执行结果
- 好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!
- 实现步骤:
- 定义父类,并提供公共方法
- 定义子类(继承父类),并重写父类方法
- 传递子类对象给调用者,可以看到不同子类执行效果不同
1.3 体验多态
需求:警务人员和警犬一起工作,警犬分2种:追击敌人和追查毒品,携带不同的警犬,执行不同的工作
分析:
1.在 Dog
类中封装方法 work
- 普通狗只是简单的工作
2.定义不同种类狗的
- 定义
ArmyDog
继承自Dog
,并且重写work
方法 - 定义
DrugDog
继承自Dog
,并且重写work
方法
3.定义 Person
类,并且封装一个 和狗工作 的方法
- 在方法内部,直接让 狗对象 调用
work
方法
案例小结
Person
类中只需要让 狗对象 调用work
方法,而不关心具体是 什么狗work
方法是在Dog
父类中定义的
- 在程序执行时,传入不同的 狗对象 实参,就会产生不同的执行效果。
# 需求:警务人员和警犬一起工作,警犬分2种:追击敌人和追查毒品,携带不同的警犬,执行不同的工作
# 1. 定义父类,提供公共方法: 警犬 和 人
class Dog(object):
def work(self): # 父类提供统一的方法,哪怕是空方法
pass
# 2. 定义子类,子类重写父类方法:定义2个类表示不同的警犬
class ArmyDog(Dog): # 继承Dog类
def work(self): # 子类重写父类同名方法
print('追击敌人...')
class DrugDog(Dog):
def work(self):
print('追查毒品...')
# 定义人类
class Person(object):
def work_with_dog(self, dog): # 传入不同的对象,执行不同的代码,即不同的work函数
dog.work() # 在方法内部,直接让 狗对象 调用 work 方法
# 3. 创建对象,调用不同的功能,传入不同的对象,观察执行的结果
ad = ArmyDog()
dd = DrugDog()
jingyuan = Person()
jingyuan.work_with_dog(ad)
jingyuan.work_with_dog(dd)
追击敌人…
追查毒品…