派生类属性

时间:2018-01-30 22:59:20

标签: python

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的输出不同?

1 个答案:

答案 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/

     

...

     

类属性赋值更新类的字典,而不是基类的字典。