未调用属性装饰器的 setter 方法
Posted
技术标签:
【中文标题】未调用属性装饰器的 setter 方法【英文标题】:setter method of property decorator not being called 【发布时间】:2013-02-26 15:12:49 【问题描述】:我正在尝试使用属性方法来设置类实例的状态,类定义如下:
class Result:
def __init__(self,x=None,y=None):
self.x = float(x)
self.y = float(y)
self._visible = False
self._status = "You can't see me"
@property
def visible(self):
return self._visible
@visible.setter
def visible(self,value):
if value == True:
if self.x is not None and self.y is not None:
self._visible = True
self._status = "You can see me!"
else:
self._visible = False
raise ValueError("Can't show marker without x and y coordinates.")
else:
self._visible = False
self._status = "You can't see me"
def currentStatus(self):
return self._status
从结果来看,setter 方法似乎没有被执行,尽管内部变量正在被改变:
>>> res = Result(5,6)
>>> res.visible
False
>>> res.currentStatus()
"You can't see me"
>>> res.visible = True
>>> res.visible
True
>>> res.currentStatus()
"You can't see me"
我做错了什么?
【问题讨论】:
【参考方案1】:在 Python 2 上,您必须从 object
继承才能使属性起作用:
class Result(object):
使它成为一个新样式的类。通过该更改,您的代码可以工作:
>>> res = Result(5,6)
>>> res.visible
False
>>> res.visible = True
>>> res.currentStatus()
'You can see me!'
【讨论】:
以上是关于未调用属性装饰器的 setter 方法的主要内容,如果未能解决你的问题,请参考以下文章
修复处理 @property setter 装饰器的 pyflakes
在类中装饰 @property.setter 装饰器 [重复]