Python @property setter中的约束未应用

时间:2018-08-31 18:09:03

标签: python python-3.x

我有一个非常简单的类,它将温度转换为华氏温度,此外,它还可以确保该值大于-273

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

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

    @property
    def temperature(self):
        print('Getting_value')
        return self._temperature


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

如果我运行以下代码

c = Celsius()
c.temperature=23
c.to_fahrenheit()

我得到了预期的输出:

Setting value
Getting_value
Out[89]:
73.4

现在尝试将温度设置为-275,我们得到了预期的错误!

c = Celsius()
c.temperature=-275
c.to_fahrenheit()
  

-------------------------------------------------- ---------------------------- ValueError Traceback(最近的呼叫   最后)在()         1 c =摄氏()   ----> 2 c。温度= -275         3 c.to_fahrenheit()

     

温度(自身,值)        15 def温度(自身,值):        如果值<-273,则为16:   ---> 17提高ValueError(“低于-273的温度是不可能的”)        18打印(“设定值”)        19 self._temperature =值

     

ValueError:温度不能低于-273

到目前为止一切顺利!但是问题是,如果我在上课时尝试设置温度,我可以选择-275,并且不会提示错误

c = Celsius(-275)
c.to_fahrenheit()

> Getting_value Out[88]:
> -463.0

我的问题是为什么它不触发错误?据我了解,@temperature.setter将确保检查温度是否为<-273,但由于某种原因它会通过。

2 个答案:

答案 0 :(得分:3)

发生这种情况是因为您在 init 方法中使用了

self._temperature = temperature

您的温度设定器无法执行。您可以将代码更改为

self.temperature = temperature

它将执行温度设置器方法并引发Exception。

答案 1 :(得分:0)

因为您没有调用属性,而是调用了private属性。您应该将其类的构造函数更改为:

def __init__(self, temperature = 0):
    self.temperature = temperature

现在,当您启动课程时,将使用该属性,并且在输入错误的情况下,您将获得异常。