【问题标题】:setter method of property decorator not being called未调用属性装饰器的 setter 方法
【发布时间】: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"

我做错了什么?

【问题讨论】:

    标签: python class properties decorator python-decorators


    【解决方案1】:

    在 Python 2 上,您必须object 继承才能使属性起作用:

    class Result(object):
    

    使它成为一个新样式的类。通过该更改,您的代码可以工作:

    >>> res = Result(5,6)
    >>> res.visible
    False
    >>> res.visible = True
    >>> res.currentStatus()
    'You can see me!'
    

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 2017-11-28
      • 2018-09-06
      • 2019-07-09
      • 1970-01-01
      • 2014-06-25
      • 2023-03-10
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多