使用枯燥的类,对象实例属性影子类属性:
class C(object):
a="class_a"
def __init__(self, a):
self.a = a
c = C(a="obja")
print c.a # obja
但是如果我的类属性是在named_tuple基础中声明的:
class C(collections.namedtuple("CBase", ['a', ])):
a="class_a"
c = C(a="obja")
print c.a # class_a !!??!
...所以,通过名称元组声明我的实例属性会导致该属性被类属性遮蔽...这不是你所期望的。
为什么会这样?
答案 0 :(得分:3)
namedtuple
“属性”在类本身上实现为descriptors(specifically, property
s),而不是传统意义上的属性(所有实际数据都存储在{的未命名索引中{1}})。在这种情况下,tuple
(粗略地)定义:
namedtuple
由于属性是类级别属性,因此在子类上定义@property
def a(self):
return self[0]
时,它会影响父类中的等效定义。