猿问

python中的链调用父初始化程序

考虑一下-基类A,类B从A继承,类C从B继承。在初始化器中调用父类初始化器的通用方法是什么?如果这听起来仍然不太明确,请使用以下代码。


class A(object):

    def __init__(self):

        print "Initialiser A was called"


class B(A):

    def __init__(self):

        super(B,self).__init__()

        print "Initialiser B was called"


class C(B):

    def __init__(self):

        super(C,self).__init__()

        print "Initialiser C was called"


c = C()

这就是我现在的做法。但是它似乎仍然太泛泛,您仍然必须手动传递正确的类型。


现在,我尝试使用self.__class__super()作为第一个参数,但是显然,它不起作用-如果将其放在C的初始化程序中-足够公平,B的初始化程序将被调用。如果在B中执行相同的操作,则“ self”仍指向C的实例,因此您最终再次调用B的初始化程序(此操作以无限递归结束)。


现在无需考虑钻石继承,我只是想解决这个特定问题。


慕的地10843
浏览 282回答 3
3回答

UYOU

确实推荐这样做(对于Python 2.x)。是否明确将类传递给类super的问题是样式问题,而不是功能问题。通过该类以super符合Python的“显式优于隐式”的哲学。

杨__羊羊

super(X,obj)实际上返回一个特殊的“ super”对象,当您对其进行属性访问时,该对象将返回如果类X根本没有属性,则该属性将被返回。例如,super(X,obj).__ init__将返回obj的init方法,就好像没有X类中的init一样。现在,如果类X有两个父级,并且X .__ init__不存在,则默认行为是仅调用其中一个父级的init,而不是两个父级的init。这实际上是super在做的事情……给您父母之一。
随时随地看视频慕课网APP

相关分类

Python
我要回答