在Python中,“无法使用新样式属性设置属性”

我试图使用新式的属性声明:

class C(object): def __init__(self): self._x = 0 @property def x(self): print 'getting' return self._x @x.setter def set_x(self, value): print 'setting' self._x = value if __name__ == '__main__': c = C() print cx cx = 10 print cx 

并在控制台中查看以下内容:

 pydev debugger: starting getting 0 File "\test.py", line 55, in <module> cx = 10 AttributeError: can't set attribute 

我究竟做错了什么? PS:旧式宣言正常。

该文档说明以下关于使用装饰器propertyforms:

一定要赋予与原始属性相同的附加function(在这种情况下为x)。

我不知道为什么这是因为如果你使用property作为函数返回一个属性的方法可以调用任何你喜欢的。

所以你需要改变你的代码如下:

 @x.setter def x(self, value): 'setting' self._x = value 

setter方法必须与getter具有相同的名称。 别担心,装饰者知道如何区分他们。

 @x.setter def x(self, value): ... 

当您调用@ x.setter,@ x.getter或@ x.deleter时,您将创build一个新的属性对象,并为其指定正在装饰的函数的名称。 所以,真正重要的是,你最后一次在类定义中使用@ x。* er装饰器,它有你想要使用的名字。 但是,由于这会让您的类名称空间受到您希望使用的属性的不完整版本的污染,所以最好使用相同的名称进行清理。