zoukankan      html  css  js  c++  java
  • python 多态

    python是弱类型语言,其最明显的特征是在使用变量时,无需为其指定具体的数据类型。这会导致一种情况,即同一变量可能会被先后赋值不同的类对象。

    class xiaobai:
        def say(self):
            print("赋值的是xiaobai类的实例对象")
    class lilei:
        def say(self):
            print("赋值的是lilei类的实例对象")
    a = xiaobai()
    a.say()
    
    a = lilei()
    a.say()
    
    赋值的是xiaobai类的实例对象
    赋值的是lilei类的实例对象
    

    可以看到,a可以被先后赋值为xiaobai类和lilei类的对象,但这并不是多态。类的多态特性,还要满足以下2个前提条件:

    1. 继承:多态一定是发生在子类和父类之间
    2. 重写:子类重写了父类的方法
    class xiaobai:
        def say(self):
            print("调用的是xiaobai类的say方法")
    class lilei(xiaobai): #lilei类继承xiaobai类,即lilei类是xiaobai类的子类
        def say(self):
            print("调用的是lilei类的say方法")
    class mary(xiaobai):
        def say(self):
            print("调用的是mary类的say方法")
    a = xiaobai()
    a.say()
    
    a = lilei()
    a.say()
    
    a = mary()
    a.say()
    
    调用的是xiaobai类的say方法
    调用的是lilei类的say方法
    调用的是mary类的say方法
    
    #可以看到,lilei和mary都继承自xiaobai类,且各自都重写了父类的say()方法。
    #同一变量a在执行同一个say()方法时,由于a实际表示不同的类实例对象,因此a.say()调用的并不是同一个类中的say()方法,这就是多态。
    

    仅仅学到上面知识,我们还无法领略python类使用多态特性的精髓。其实,python在多态的基础上,衍生出了一种更灵活的编程机制

    class whosay:
        def say(self, who):
            who.say()
    
    #通过whosay类中的say()函数添加一个who参数,其内部利用传入的who调用say()方法。
    #这意味着,当调用whosay类中的say()方法时,我们传给who参数的是哪个类的实例对象,它就会调用那个类中的say()方法。
    
    class xiaobai:
        def say(self):
            print("调用的是xiaobai类的say方法")
    class lilei(xiaobai):
        def say(self):
            print("调用的是lilei类的say方法")
    class mary(xiaobai):
        def say(self):
            print("调用的是mary类的say方法")
            
    a = whosay()
    a.say(xiaobai())
    a.say(lilei())
    a.say(mary())
    
    调用的是xiaobai类的say方法
    调用的是lilei类的say方法
    调用的是mary类的say方法
    

    "鸭子模型":通过给whosay()类中的say()函数添加一个who参数,其内部利用传入的who调用say()方法。这意味着,当调用whosay类中的say()方法时,我们传给who参数的是哪个类的实例对象,它就会调用那个类中的say()方法。

  • 相关阅读:
    asp.net中,<%#%>,<%=%>和<%%>分别是什么意思,有什么区别
    解决IE11下载文件 文件名乱码问题
    gridview DataFormatString 属性设置须知
    SQL Server 2008 Windows身份验证改为混合模式身份验证 及修改sa密码
    如何解决IIS7上传文件大小限制,.NET 上传文件后 找不到目录解决
    windows server 2008 r2, 每隔一段时间自动关机
    思科DCHP解决方案
    2016.10.01
    oracle中,拼接的字符串给游标赋值
    IoDH 实现的单例模式
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12229490.html
Copyright © 2011-2022 走看看