我在使用Python中的多重继承时遇到了一些问题,无法理解我做错了什么。
我有三个类A,B,C定义如下,它不起作用。
class A(object):
def __init__(**kwargs):
.
.
class B(object):
def __init__(**kwargs):
# prepare a dictionary "options" with the options used to call A
super(B,self).__init__(**options)
def coolmethod(x):
#some cool stuff
对于A和B,我没有任何问题。
我想创建一个继承A和B的第三个C类 所以我可以在B中定义coolmethod,但是想使用A中定义的构造函数。
尝试定义class C(A,B)
不起作用,因为未定义MRO。
但是定义class C(B,A)
不允许我使用A. init 而不是B. init 。
我该如何解决这个问题?
答案 0 :(得分:2)
您可以直接调用A .__ init __()而不是在C:中使用super():
class C(B,A):
def __init__(self, **kwargs):
A.__init__(self, **kwargs)
答案 1 :(得分:2)
您可以使用
class A(object):
def __init__(self, **kwargs):
super(A, self).__init__(**kwargs)
如果您期望从A和其他东西进行多重继承。这样,A.__init__
将始终被调用。
由于方法解析在python中的工作方式,顺序很重要。如果从(A,B)继承C,则意味着如果在A和B上同时存在C上的方法,则选择A上的方法(它具有优先权)。如果您在A类中编写super(A, self).method
,则表示您希望扩展method
提供的功能。因此,如果A和B都具有这样的扩展并且C继承自两者,则跳过一个这样的扩展将是奇怪的。这就是为什么当您致电C.method
时,它会执行A.method
,在调用B.method
时会调用super(A, self).method
。换句话说,就像方法扩展一样,A就像是从B继承而来。当C继承自(B,A)时,这是不同的。
请注意,__init__
的第一个参数应始终为self
,就像每个方法一样。