为什么 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, propertys),而不是传统意义上的属性(所有实际数据都存储在未命名的索引中tuple)。在这种情况下,namedtuple(大致)定义:

@property
def a(self):
    return self[0]

由于 属性 是 class 级别属性,当您在子 class 上定义 a 时,它会隐藏父 class 中的等效定义].