您的位置:首页 > 其它

多继承

2015-09-19 09:31 232 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: