千万 不能* 使用super(baseclass, ...)
,除非你知道自己在做什么。第一个参数super()
告诉它寻找下一个要使用的方法时要
跳过的 类。例如,super(A, ...)
将查看MRO,找到A
,然后开始 在下一个 基类 而不是
本身__init__
上寻找。因为,MRO是,所以会找到。 ***
A``C``(C, A, B, object)``super(A,self).__init__``B.__init__
对于这些情况,你不希望使用合作继承,而是直接引用
A.__init__和
B.__init__替代。
super()仅在您所调用的方法具有
相同签名时使用, 否则将使用
*args和吞下不受支持的参数
**vargs。在这种情况下,只
super(C,self).__init__()需要一个调用,MRO顺序中的下一个类将负责该调用的链接。
换种说法:使用时
super(),您无法知道MRO中的下一个类,因此该类更好地支持传递给它的参数。如果不是这种情况,请 不要 使用
super()。
__init__直接调用基本方法:
class A(object): def __init__(self, a, b): print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))class B(object): def __init__(self, q): print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))class C(A, B): def __init__(self): # Unbound functions, so pass in self explicitly A.__init__(self, 1, 2) B.__init__(self, 3)使用合作社
super():
class A(object): def __init__(self, a=None, b=None, *args, **kwargs): super().__init__(*args, **kwargs) print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))class B(object): def __init__(self, q=None, *args, **kwargs): super().__init__(*args, **kwargs) print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))class C(A, B): def __init__(self): super().__init__(a=1, b=2, q=3)


