Python:使用属性覆盖成员?

rai*_*ner 1 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
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*son 9

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

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

如果你改变:

class Base: #old style class
Run Code Online (Sandbox Code Playgroud)

至:

class Base(object):  #new style class
Run Code Online (Sandbox Code Playgroud)

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