Python进阶(8) — 多态

◎知识点

  1. 多态的定义及示例


◎脚本练习

"""多态"""

"""
    除了封装和继承,多态也是面向对象编程的三大特征之一
    简单地说,多态就是"具有多种形态",它指的是:即便不知道一个变量所引用的对象到底是什么类型,
    仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态地决定引用哪个对象中的方法
    
    如果子类中不存在指定名称的方法,回到父类中去查找,如果在父类中找到了,则调用父类中的方法
"""

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()这个方法
"""


◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_advanced/polymorphism.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5217.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注