码迷,mamicode.com
首页 > 编程语言 > 详细

python 多态

时间:2020-01-22 21:52:06      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:elf   参数   print   条件   pytho   添加   继承   重写   数据类型   

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):
    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在多态的基础上,衍生出了一种更灵活的编程机制

class whosay:
    def say(self, who):
        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()方法。

python 多态

标签:elf   参数   print   条件   pytho   添加   继承   重写   数据类型   

原文地址:https://www.cnblogs.com/xiaobaizzz/p/12229490.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!