Python:使用属性覆盖成员?

时间:2013-01-22 20:02:40

标签: python inheritance properties

我试图用属性覆盖Python(2.7)类的成员,如下面的代码所示:

class Base:
    def __init__(self):
        self.foo = 1

class Derived(Base):
    foo = property(lambda self: 2)

print Derived().foo

然而,最后一行打印1而不是2.从我认为属性应该工作的方式(即,稍后可以轻松地将成员更改为函数),这对我来说似乎是违反直觉的。我错过了什么吗?有一些解决方法吗?

1 个答案:

答案 0 :(得分:9)

这不起作用,因为您没有使用新式课程。属性为descriptors,仅适用于新式类。你的代码正在做的是:

您创建了一个具有类属性Derived的类foo。然后,当您创建类的实例时,Base.__init__接管,因为Derived没有__init__,并且您添加了优先于类属性的实例属性foo。 / p>

如果你改变:

class Base: #old style class

为:

class Base(object):  #new style class

你会遇到一个全新的问题,主要是你的财产没有经过适当定义的setter,所以当你在self.foo = 1Base.__init__进行{&1}}时#39;获得AttributeError