1

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

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

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

print Derived().foo

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

4

1 回答 1

9

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

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

如果你改变:

class Base: #old style class

到:

class Base(object):  #new style class

你会遇到一个全新的问题,主要是你的属性没有适当定义setter,所以当你这样做时self.foo = 1Base.__init__你会得到一个AttributeError

于 2013-01-22T20:03:03.310 回答