【问题标题】:Python 2.7 Method Resolution Order overrridePython 2.7 方法解析顺序覆盖
【发布时间】:2013-04-29 16:02:17
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

    class C(B,A):
        def __init__(self, **kwargs):
            A.__init__(self, **kwargs)
    

    【讨论】:

    • 谢谢..这很容易..我不明白为什么类声明中的顺序很重要..
    • 有关订单的说明,请参见下面的回答。
    【解决方案2】:

    你可以使用

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多