未应用 Python @property setter 中的约束

H.B*_*ari 2 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
Run Code Online (Sandbox Code Playgroud)

如果我运行以下代码

c = Celsius()
c.temperature=23
c.to_fahrenheit()
Run Code Online (Sandbox Code Playgroud)

我得到预期的输出:

Setting value
Getting_value
Out[89]:
73.4
Run Code Online (Sandbox Code Playgroud)

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

c = Celsius()
c.temperature=-275
c.to_fahrenheit()
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- ------------------------- ValueError Traceback (最近一次调用最后一次) in () 1 c =Celsius() ----> 2 c.温度=-275 3 c.to_fahrenheit()

in temperature(self, value) 15 def temperature(self, value): 16 if value < -273: ---> 17 raise ValueError("温度低于 -273 是不可能的") 18 print("设置值") 19 self._温度 = 值

ValueError: 温度低于 -273 是不可能的

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

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

> Getting_value Out[88]:
> -463.0
Run Code Online (Sandbox Code Playgroud)

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

Dmi*_*lev 5

这是因为您在init方法中使用

self._temperature = temperature

并且您的温度设置器不执行。您可以将代码更改为

self.temperature = temperature

它将执行温度设置方法并引发异常。