Python的多重继承:选择哪个super()

2024-04-16 04:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,如何选择要调用哪个父方法?假设我想调用父ASDF2的__init__方法。似乎我必须在super()中指定ASDF1。。?如果我想调用ASDF3的__init__,那么我必须指定ASDF2?!

>>> class ASDF(ASDF1, ASDF2, ASDF3):
    def __init__(self):
        super(ASDF1, self).__init__()


>>> ASDF()
ASDF2's __init__ happened
>>> class ASDF(ASDF1, ASDF2, ASDF3):
    def __init__(self):
        super(ASDF2, self).__init__()


>>> ASDF()
ASDF3's __init__ happened

在我看来很疯狂。我做错什么了?


Tags: 方法selfinitdefclasssuperasdfhappened
3条回答

将ASDF1(父类之一)作为第一个参数传递给super()。别那么做。相反,您应该将ASDF作为第一个参数传递给super()。

Python 2.7 documentation for super()

引用Python2.7文档,典型的超类调用如下所示:

class C(B):
    def method(self, arg):
        super(C, self).method(arg)

注意这里super的第一个参数是C,它是当前类。不要将B(父类)传递给super()。

在确定方法解析顺序(MRO)时,超级跳过作为其第一个参数传入的类,并开始查看该类的父类和兄弟类。因此,当您将ASDF1作为第一个参数传递给super()时,它跳过ASDF1并使用ASDF2开始搜索。这就是为什么ASDF2的__init__被调用的原因。


在Python3中,您不必再传递当前类。

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)
                               # (Python 3 only)

这不是^{}的目的。Super基本上是按照特定的顺序选择一个(或所有)父对象。如果只想调用单亲的方法,请执行以下操作

class ASDF(ASDF1, ASDF2, ASDF3):
    def __init__(self):
        ASDF2.__init__(self)

super按方法解析顺序调用下一个方法。在线性继承树中,这将是来自直接父类的方法。

在这里,你有三个父母,从ASDF1的角度来看,下一个__init__方法是ASDF2。一般来说,安全的做法是将继承列表中的第一个类传递给super,除非您知道为什么要执行其他操作。

所有这一切的目的是让您不必显式地选择要调用的__init__方法。这里的问题是为什么不想调用所有的超类__init__方法。

关于python中super的使用,有相当多的文献,我建议您用google搜索这个主题,并阅读结果。

相关问题 更多 >