首页 > 其他 > 详细

多继承

时间:2015-09-19 09:36:09      阅读:206      评论:0      收藏:0      [点我收藏+]

python中支持多继承。当用派生类对象调用函数时,如果派生类有定义该函数,那么它就覆盖基类中的函数

class X(object):
    def __init__(self):
        print(‘X‘)

class Z(X):
    def __init__(self):
        print("Z")

>> z = Z()    # 派生类__init__覆盖了基类的__init__
>> Z

 

如果想调用到基类被覆盖的函数,那么应该通过显示调用

class X(object):
    def __init__(self):
        print(‘X‘)

class Z(X):
    def __init__(self):
        super().__init__()  # 对于python 2.x,super(Z, self).__init__()
        print("Z")

>> z = Z()
>> X
   Z

 

super()是访问到基类的关键,那么如何理解super()?

super是沿着最初始调用类的MRO链执行调用的。也就是说,super()第一次调用,是取到MRO链中第一个元素;第二次调用,第二个

class X(object):
   def __init__(self, a):
       print(‘--X‘)
       super().__init__(2)
       print(‘X--‘)
   def hello(self, a):
        pass

class Y(object):
   def __init__(self, a):
       print(‘--Y‘)
       super().__init__()
       print(‘Y--‘)

class Z(X, Y):
   def __init__(self, a):
       print(‘--Z‘)
       super().__init__(a)
       print(‘Z--‘)

print(Z.__mro__)
z = Z(1)

>> (<class ‘__main__.Z‘>, <class ‘__main__.X‘>, <class ‘__main__.Y‘>,<class ‘object‘>)
>> --Z
>> --X
>> --Y
>> Y--
>> X--
>> Z--

由上可知,在Z中调用super(),得到是X;然后在X中super(),得到是Y;在Y中调用super(),得到是object

需要注意的是:这种多继承MRO链式调用,适用于调用函数的参数形式一致(或者没有参数,如close、get类函数)的情况。

 

参考: http://www.artima.com/weblogs/viewpost.jsp?thread=281127

多继承

原文:http://www.cnblogs.com/johnchow/p/4820923.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!