这是对这个问题的扩展并提出了一个问题,你,我的 StackOverflowers 伙伴,希望能够帮助我。从引用的问题中,考虑最终的代码示例:
class A(object):
def __init__(self):
print "entering A"
print "leaving A"
class B(object):
def __init__(self):
print "entering B"
super(B, self).__init__()
print "leaving B"
class C(A,B):
def __init__(self):
print "entering c"
super(C, self).__init__()
print "leaving c"
正如海报所指出的,在初始化 C 时,__init__
永远不会调用 for B 。在考虑Raymond Hettinger 的帖子class A
时,应将代码修改为也调用super().__init__()
:
class A(object):
def __init__(self):
print "entering A"
super(A, self).__init__()
print "leaving A"
到目前为止,我们都很好。但是,如果我们类的__init__
函数接受参数怎么办?让我们假设所有__init__
函数都接受一个参数,为了保持一致性,我们将简单地调用它foo
,代码现在是:
class A(object):
def __init__(self, foo):
print "entering A"
super(A, self).__init__(foo)
print "leaving A"
class B(object):
def __init__(self, foo):
print "entering B"
super(B, self).__init__(foo)
print "leaving B"
class C(A,B):
def __init__(self, foo):
print "entering c"
super(C, self).__init__(foo)
print "leaving c"
在这里,我们遇到了障碍。当初始化任何类 A、B 或 C 时,我们最终会object.__init__
使用单个参数调用foo
,但会出错TypeError: object.__init__() takes no parameters
。但是,删除其中一个super().__init__
函数意味着在多重继承的情况下类不再协作。
毕竟,我的问题是如何解决这个问题?似乎除了没有参数传递给__init__
函数的情况之外,多重继承在任何情况下都被破坏了。
更新:
Rob 在评论中建议剥离关键字参数(在 Raymond H 的帖子中引用)。在您更改代码之前,这实际上在多重继承的情况下非常有效。如果您的函数之一不再使用关键字参数之一并且在不修改调用函数的情况下停止剥离它,您仍然会收到上面提到的 TypeError。因此,对于大型项目来说,这似乎是一个脆弱的解决方案。