class A(object):
def __init__(self, a, b, c):
#super(A, self).__init__()
super(self.__class__, self).__init__()
class B(A):
def __init__(self, b, c):
print super(B, self)
print super(self.__class__, self)
#super(B, self).__init__(1, b, c)
super(self.__class__, self).__init__(1, b, c)
class C(B):
def __init__(self, c):
#super(C, self).__init__(2, c)
super(self.__class__, self).__init__(2, c)
C(3)
在上面的代码中,注释掉的 __init__
调用似乎是普遍接受的进行父类(super class)初始化的“智能”方式。但是,如果类层次结构可能发生变化,我一直使用未注释的形式,直到最近。
似乎在调用上述层次结构中B
的 super 构造函数时,再次调用了B.__init__
,self.__class__
实际上是 C
,而不是我一直假设的 B
。
在 Python-2.x 中有什么方法可以在调用 super 构造函数而不命名当前类时保持适当的 MRO(关于以正确的顺序初始化所有父类)( B
在 super(B, self).__init__(1, b, c)
)?
最佳答案
简短回答:不,在 Python 2.x 中无法使用正确父类的正确参数隐式调用正确的 __init__
。
顺便说一句,这里显示的代码是不正确的:如果您使用 super().__init__
,那么您层次结构中的所有类在它们的 __init__
中必须具有相同的签名方法。否则,如果您引入一个使用多重继承的新子类,您的代码可能会停止工作。
参见 http://fuhm.net/super-harmful/有关问题的详细说明(带图片)。
关于python - 隐式调用父类初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2354769/