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
时间: 2024-07-28 16:23:07