Python核心编程中指出,属性的优先级别为:
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.默认的__getattr__()
问题就在类属性和实例属性上,代码如下:
class A( object ): foo = 1.3 ; a = A(); print a.foo; a.foo = 15 ; print a.foo; del a.foo; print a.foo; |
输出为1.3,15后最后一次又一次的输出了1.3
但不是说类属性的优先级高于实例属性吗?那为什么a.foo=15是创建了一个实例属性foo而不是将类属性foo的值改为15?
百思不得其解,请问各位高人
属性访问的主题比较复杂:它涉及 类、实例,还有 普通属性、数据描述符、非数据描述符 之分,而且针对 获取、设置、删除 的处理规则也不同,不能一概而论。
详细讲解看这里:Python基础:新式类的属性访问
a.foo=15 相当于对象定义了一个属性,在a.__dict__中可以看到foo.两次输出1.3是因为a没有foo属性就从a的类A中取foo属性