1

我在 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 和 BI 没有任何问题。

我想创建一个继承自 A 和 B 的第三个类 C,以便我可以使用 B 中定义的酷方法,但想使用 A 中定义的构造函数。

尝试定义class C(A,B)不起作用,因为未定义 MRO。

但是定义class C(B,A)不允许我使用 A. init而不是 B. init

我该如何解决这个问题?

4

2 回答 2

2

您可以使用

class A(object):
    def __init__(self, **kwargs):
        super(A, self).__init__(**kwargs)

如果您期望从 A 和其他东西进行多重继承。这样,A.__init__总会被调用。

由于方法解析在 python 中的工作方式,顺序很重要。如果 C 继承自 (A, B),则意味着如果调用 C 上同时存在于 A 和 B 上的方法,则选择 A 上的方法(它具有优先级)。如果您super(A, self).method在 A 类中编写,则意味着您要扩展method. 因此,如果 A 和 B 都具有这样的扩展并且 C 继承自两者,那么跳过一个这样的扩展将会很奇怪。这就是为什么当你调用C.method时它会执行A.method,它会B.method在它调用时调用super(A, self).method。换句话说,就好像为了方法扩展的目的,A 从 B 继承。当 C 继承自 (B, A) 时,情况就不同了。

请注意,__init__第一个参数应该始终是self,就像每个方法一样。

于 2013-05-21T07:00:34.960 回答
2

您可以直接调用 A.__init__() 而不是在 C 中使用 super():

class C(B,A):
    def __init__(self, **kwargs):
        A.__init__(self, **kwargs)
于 2013-04-29T16:36:46.187 回答