为什么nametuple属性被类属性遮蔽?

时间:2018-04-03 02:16:19

标签: python namedtuple

使用枯燥的类,对象实例属性影子类属性:

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 !!??!

...所以,通过名称元组声明我的实例属性会导致该属性被类属性遮蔽...这不是你所期望的。

为什么会这样?

1 个答案:

答案 0 :(得分:3)

namedtuple“属性”在类本身上实现为descriptorsspecifically, propertys),而不是传统意义上的属性(所有实际数据都存储在{的未命名索引中{1}})。在这种情况下,tuple(粗略地)定义:

namedtuple

由于属性是类级别属性,因此在子类上定义@property def a(self): return self[0] 时,它会影响父类中的等效定义。