未应用 Python @property setter 中的约束

我有一个非常简单的类,它将温度转换为华氏度,另外它确保值大于 -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 (最近一次调用最后一次) 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

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


蝴蝶不菲
浏览 120回答 2
2回答

FFIVE

这是因为您在init方法中使用self._temperature = temperature并且您的温度设置器不执行。您可以将代码更改为self.temperature = temperature它将执行温度设置方法并引发异常。

胡说叔叔

因为您没有调用属性,而是调用了私有属性。您应该将类的构造函数更改为它:def&nbsp;__init__(self,&nbsp;temperature&nbsp;=&nbsp;0): &nbsp;&nbsp;&nbsp;&nbsp;self.temperature&nbsp;=&nbsp;temperature现在,当您启动类时,该属性将使用,并且在错误输入中您将收到异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python