◎知识点
多态的定义及示例
◎脚本练习
"""多态"""
"""
除了封装和继承,多态也是面向对象编程的三大特征之一
简单地说,多态就是"具有多种形态",它指的是:即便不知道一个变量所引用的对象到底是什么类型,
仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态地决定引用哪个对象中的方法
如果子类中不存在指定名称的方法,回到父类中去查找,如果在父类中找到了,则调用父类中的方法
"""
class ParentClass(object):
def do_sth(self):
print("do_sth() in ParentClass")
class ChildClass1(ParentClass):
def do_sth(self):
print("do_sth() in ChildClass1")
class ChildClass2(ParentClass):
def do_sth(self):
print("do_sth() in ChildClass2")
class ChildClass3(ParentClass):
pass
class SomeClass(object):
def do_sth(self):
print("do_sth() in SomeClass")
def f(parent):
parent.do_sth()
f(ParentClass()) # do_sth() in ParentClass
f(ChildClass1()) # do_sth() in ChildClass1
f(ChildClass2()) # do_sth() in ChildClass2
f(SomeClass()) # do_sth() in SomeClass
f(ChildClass3()) # do_sth() in ParentClass
"""
python是动态语言,在调用函数时不会检查参数的类型,从而导致与静态语言(例如Java)的多态
是有区别的。对于静态语言,实现多态有三个必要条件
(1) 继承
(2) 重写
(3) 父类类型的变量引用父类或子类类型的实例对象
因此,对于静态语言,在上面的程序中,要限定形参parent的类型是ParentClass,传入的实参只能是
ParentClass、ChildClass1和ChildClass2的实例对象
动态语言的多态崇尚"鸭子类型":当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,
那么这只鸟就可以被称为鸭子
在鸭子类型中,我们并不关心是什么类型,到底是不是鸭子,只关心对象的行为
在上面的程序中,我们并不关心变量parent所引用的对象是什么类型,到底是不是ParentClass或
其子类类型,只关心变量parent所引用的对象是否有do_sth()这个方法
"""
Python