Python 2.7方法解析订单覆盖

时间:2013-04-29 16:02:18

标签: python python-2.7 multiple-inheritance method-resolution-order

我在使用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

我该如何解决这个问题?

2 个答案:

答案 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,就像每个方法一样。