python - 从父类继承的孙子 - Python

标签 python multiple-inheritance

我正在学习所有关于 Python 类的知识,而且我有很多基础知识要涵盖。 我遇到了一个让我有点困惑的例子。

这些是父类

Class X
Class Y
Class Z

子类是:

Class A (X,Y)
Class B (Y,Z)

孙子类是:

Class M (A,B,Z)

Class M 不是通过继承Class B 来继承Class Z 的吗?或者说这种结构的原因是什么? Class M 会忽略第二次 Class Z 被继承,不是吗,还是我遗漏了什么?

最佳答案

Class M would just inherit the Class Z attributes twice (redundant) wouldn't it be, or am I missing something?

不,没有“重复的”属性,Python 执行线性化,它们可以方法解析顺序 (MRO),例如,说明 here .但是,您在此处添加 Z 是正确的到列表不会改变任何东西。

他们首先为 parent 构建 MRO,因此:

MRO(X) = (X,object)
MRO(Y) = (Y,object)
MRO(Z) = (Z,object)

MRO(A) = (A,X,Y,object)
MRO(B) = (B,Y,Z,object)

然后他们为 M 构建了一个 MRO通过合并:

MRO(M) = (M,)+merge((A,X,Y,object),(B,Y,Z,object),(Z,object))
       = (M,A,X,B,Y,Z,object)

现在每次调用方法时,Python 都会首先检查该属性是否在内部字典中self.__dict__该对象)。否则,Python 将遍历 MRO 并尝试查找具有该名称的属性。从找到一个的那一刻起,它将停止搜索。

最后super()是一个执行相同解析的代理对象,但在类的阶段在 MRO 中启动。所以在这种情况下,如果你有:

class B:

    def foo():
        super().bar()

然后你构造了一个对象m = M()并调用m.foo()然后 - 给定 foo()B被称为,super().bar将首先尝试找到 barY ,如果失败,它将寻找 barZ最后在 object .

属性不会被继承两次。如果您添加如下属性:

self.qux = 1425

然后它被简单地添加到内部self.__dict__该对象的字典。

说明 Z明确然而可能是有益的:如果 B 的设计师不确定是否Z是一个真正的要求。在那种情况下,您肯定知道 Z如果 B 仍将在 MRO 中被改变了。

关于python - 从父类继承的孙子 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838923/

相关文章:

python - python/django 中的电子邮件白名单/黑名单

python - 我可以在不为我的计算机生成证书的情况下验证 Azure 凭据吗?

Python 3 : sort rows in 2D matrix, 其中列是列表

java - 为什么使用具有共同祖先的菱形案例来解释 Java 多继承问题,而不是两个不相关的父类?

python - 如何重新实现 QGraphicsPixmapItem 的 itemChange 和 mouseMoveEvent?

python - 从 MySQL 迁移到 Postgres 后了解 "SEPARATOR"处或附近的语法错误

c++ - 在 C++ 的异常层次结构中引入额外的基类型?

c++ - 为什么 const/non-const 函数重载的继承不明确?

c++ - 如何调用所有可变继承类的函数?

c++ - 虚继承中direct base是如何构造的?