Class A():
x=0
class B(A):
b=1
B中的 1 - print(B.__dict__)
#no x属性 dict
if B.x==0:
B.x=1
2 - print(B.__dict__)
#在B. dict 中有x属性
为什么1和2的输出不同?
答案 0 :(得分:1)
因为x
属于A
。请注意,B
可以访问A
命名空间,因为它继承自A
,但这并不意味着两个命名空间是等效的。 B
在您的第二个示例中有一个x
属性,因为您为x
提供了B
属性:即B.x=1
熟悉Python Data Model非常重要。注意,在"自定义类"下的标准类型层次结构中。有一些高度相关的信息:
自定义类类型通常由类定义创建(请参阅 部分类定义)。一个类有一个由a实现的命名空间 字典对象。类属性引用被转换为 此词典中的查找,例如,
C.x
被翻译为C.__dict__["x"]
(虽然有许多钩子允许 用于定位属性的其他方法)。 属性名称为 在那里找不到,属性搜索在基类中继续。 对基类的搜索使用C3方法解析顺序 即使存在'钻石'继承,它也能正常运行 结构中有多个继承路径返回 共同的祖先。有关Python使用的C3 MRO的其他详细信息可以 可以在2.3版本随附的文档中找到 https://www.python.org/download/releases/2.3/mro/...
类属性赋值更新类的字典,而不是基类的字典。