python - 隐式调用父类初始化器

标签 python constructor super python-2.x method-resolution-order

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(关于以正确的顺序初始化所有父类)( Bsuper(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/

相关文章:

java - 将 JDialog 调用到自定义 JInternalFrame 中

java - 调用 Java 关键字 super

python - 在Django模板中动态访问request.GET

python - 无法在通过python建立的tcp套接字上使用原始数据包处理mysql登录?可能是因为盐的原因?

mvvm - 是否应该通过构造函数、属性或方法调用来初始化 ViewModel

perl - 我如何调用祖 parent 的构造函数(因为未定义 parent 的构造函数)?

python - 快速入门 Flask 应用程序因某种原因失败

python - 如何检查 PyObject* 是否指向 numpy.uint8 类型

Java 方法未定义

java - 如何创建一个构造函数,它接受 "Range"对象的数组并初始化列表,列表被初始化为 ArrayList