我试图用属性覆盖Python(2.7)类的成员,如下面的代码所示:
class Base:
def __init__(self):
self.foo = 1
class Derived(Base):
foo = property(lambda self: 2)
print Derived().foo
然而,最后一行打印1而不是2.从我认为属性应该工作的方式(即,稍后可以轻松地将成员更改为函数),这对我来说似乎是违反直觉的。我错过了什么吗?有一些解决方法吗?
答案 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 = 1
中Base.__init__
进行{&1}}时#39;获得AttributeError