【发布时间】:2018-06-20 17:10:41
【问题描述】:
我有如下三个类:
class Page(object):
def __init__(self, Obj_a, Obj_b):
super().__init__(Obj_a, Obj_b)
class Report(object):
def __init__(self, Obj_a, Obj_b):
super().__init__()
class ReportingPage(Page,Report):
def __init__(self, Obj_a, Obj_b):
super().__init__(Obj_a, Obj_b)
我实例化了一个ReportingPage 对象。为此,Python 会爬取 MRO:
首先调用
Page对象,因为它在ReportingPage的继承列表中排在第一位,它调用自己的__init__方法。然后它对
Report执行相同的操作。
两件事我不明白:
为什么我必须将参数传递给
Page中的super.__init__,而Page只是要调用__init__继承自object.为什么我不必为
Report做同样的事情。
【问题讨论】:
-
当您尝试创建
Page实例时,这应该会抛出TypeError,因为object.__init__不接受任何参数 -
1.因为
Page.__init__在通过ReportingPage.__init__调用时将调用Report.__init__;这是 MRO 中的下一个。 2. 因为它是在object.__init__之前被调用的最后一个,所以没有任何东西可以传递给它(实际上它不能传递任何东西,因为object.__init__不接受它们) . -
@DrewAckerman 他们说“当你尝试创建
Page实例时”,即直接实例化Page(1, 2)。您的类不正确支持多重继承,并且仅在实例化ReportingPage或Report时有效。 -
相关:super-harmful。你已经在
ReportingPage中创建了一个菱形继承,所以你不得不在__init__中传递*args、**kwargs。 -
@wim:现在也阅读super considered super。
标签: python python-3.x multiple-inheritance