【问题标题】:Property decorator for getter and settergetter 和 setter 的属性装饰器
【发布时间】:2017-11-28 16:11:16
【问题描述】:

我对如何在这个属性装饰代码中获取和设置温度有点困惑。这是使用属性装饰器的正确方法吗?但是我不确定如何使用它。我可以调用 c.temperature 并返回初始值(0 或我用来实例化类的任何值),但之后我无法使用 set_temperature() 设置温度。我查看了有关此主题的几个 SO 答案,但可能错过了重点。

class Celsius:
  def __init__(self, temperature=0):
    self._temperature = temperature

  def to_f(self):
    return self._temperature * 1.8 + 32

  @property
  def temperature(self):
    print "Celsius:get_temperature"
    return self._temperature

  @temperature.setter
  def temperature(self, value):
    if value < -273:
        raise ValueError("Temperature below -273 is impossible")
    print "Celsius:set_temperature"
    self._temperature = value

【问题讨论】:

  • "但在那之后我无法使用 set_temperature() 设置温度" - 你为什么期望有任何名为 set_temperature 的东西?你从来没有用那个名字定义过任何东西。
  • 实际上,即使仅使用 c.temperature = 10 也无法正常工作,例如,我认为是因为我没有从对象继承(如下面的另一个答案中所述)

标签: python properties decorator python-decorators


【解决方案1】:

一个属性可以让你挂钩到属性访问,并设置属性。赋值给属性时会调用 setter:

c = Celsius(20)
c.temperature = 40

但请注意,在 Python 2 中,您需要从 object 继承才能使该属性起作用:

class Celsius(object):

演示:

>>> c = Celsius(20)
>>> c.temperature
Celsius:get_temperature
20
>>> c.temperature = 40
Celsius:set_temperature
>>> c.temperature
Celsius:get_temperature
40

【讨论】:

  • 谢谢,是的,我使用的是 python 2.7 - 而不是从对象继承。
最近更新 更多