码迷,mamicode.com
首页 > 其他好文 > 详细

多继承

时间:2015-09-19 09:36:44      阅读:135      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!