我正在学习所有关于 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
将首先尝试找到 bar
在 Y
,如果失败,它将寻找 bar
在 Z
最后在 object
.
属性不会被继承两次。如果您添加如下属性:
self.qux = 1425
然后它被简单地添加到内部self.__dict__
该对象的字典。
说明 Z
明确然而可能是有益的:如果 B
的设计师不确定是否Z
是一个真正的要求。在那种情况下,您肯定知道 Z
如果 B
仍将在 MRO 中被改变了。
关于python - 从父类继承的孙子 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838923/