【问题标题】:multiple inheritance python多重继承python
【发布时间】:2018-01-29 17:42:23
【问题描述】:

我看了Python的documentation,看不懂这条信息

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

对于大多数目的,在最简单的情况下,您可以考虑搜索 对于从父类继承为深度优先的属性, 从左到右,不在同一个类中搜索两次 在层次结构中重叠。因此,如果在 DerivedClassName,在Base1中搜索,然后(递归)在 Base1 的基类,如果在那里找不到,那就是 在Base2中搜索,以此类推。

如果是new-style class,为什么Python会在Base1的基类中递归搜索,而不是先到Base2再到Base3?

class A(object): 
    attr = 1

class B(A):
    pass
class C(A):
    attr = 2
class D(B,C):
    pass
x = D() 
print(x.attr)# 2

Mark Lutz 书中的示例。 Python 进入 D,然后是 B,然后是 C。

【问题讨论】:

  • 不清楚您为什么认为您的示例与描述不一致。另外,请使用适当的块引用格式来阐明什么是引用(并具体包括从哪里来)。
  • 您是否在问为什么C 在解析顺序中排在A 之前?如果是这样,答案是顺序只是Python 3中的深度优先搜索。(因此对冲:“对于大多数目的,在最简单的情况下,您可以想到...” 因此,您的引用之后的下一行:“事实上,它比那更复杂...”
  • 教程就是这样。它说“对于大多数用途在最简单的情况下,您可以认为搜索从父类继承的属性... ”。这显然不是说描述是完全准确或笼统的。

标签: python python-3.x multiple-inheritance


【解决方案1】:

如果您继续阅读,那么文档会说“事实上,它比这稍微复杂一些”。 你提到的东西是面向单继承语言的。 Python 的工作方式不同,它们实现了super()。您可以阅读文档以了解它是如何工作的,或/和(取决于您的好奇心程度)您可以阅读here 上的答案并开始使用代码,看看会发生什么。

祝你好运

【讨论】:

    【解决方案2】:

    根据第一次定义类时建立的方法解析顺序 (MRO) 进行属性查找。 MRO 的一个重要规则是任何类都不会出现在其任何子级之前。这意味着 D 的 MRO 是 [D, B, C, A, object],而不是您对纯深度优先搜索所期望的 [D, B, A, object, C]

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2021-08-05
      • 2021-05-16
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2012-08-08
      • 2021-05-08
      相关资源
      最近更新 更多