为什么 namedtuple 属性被 class 属性隐藏?
Why does are namedtuple attributes shadowed by class attributes?
同一个无聊的class,对象实例属性阴影class属性:
class C(object):
a="class_a"
def __init__(self, a):
self.a = a
c = C(a="obja")
print c.a # obja
但是如果我的 class 属性是在 named_tuple 基中声明的:
class C(collections.namedtuple("CBase", ['a', ])):
a="class_a"
c = C(a="obja")
print c.a # class_a !!??!
... 因此,通过名称元组声明我的实例属性会导致该属性被 class 属性隐藏...这不是您所期望的。
这是为什么?
namedtuple
"attributes" 在 class 本身上实现为 descriptors (specifically, property
s),而不是传统意义上的属性(所有实际数据都存储在未命名的索引中tuple
)。在这种情况下,namedtuple
(大致)定义:
@property
def a(self):
return self[0]
由于 属性 是 class 级别属性,当您在子 class 上定义 a
时,它会隐藏父 class 中的等效定义].
同一个无聊的class,对象实例属性阴影class属性:
class C(object):
a="class_a"
def __init__(self, a):
self.a = a
c = C(a="obja")
print c.a # obja
但是如果我的 class 属性是在 named_tuple 基中声明的:
class C(collections.namedtuple("CBase", ['a', ])):
a="class_a"
c = C(a="obja")
print c.a # class_a !!??!
... 因此,通过名称元组声明我的实例属性会导致该属性被 class 属性隐藏...这不是您所期望的。
这是为什么?
namedtuple
"attributes" 在 class 本身上实现为 descriptors (specifically, property
s),而不是传统意义上的属性(所有实际数据都存储在未命名的索引中tuple
)。在这种情况下,namedtuple
(大致)定义:
@property
def a(self):
return self[0]
由于 属性 是 class 级别属性,当您在子 class 上定义 a
时,它会隐藏父 class 中的等效定义].