为了账号安全,请及时绑定邮箱和手机立即绑定

未应用 Python @property setter 中的约束

未应用 Python @property setter 中的约束

蝴蝶不菲 2021-06-04 14:46:08
我有一个非常简单的类,它将温度转换为华氏度,另外它确保值大于 -273class 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=23c.to_fahrenheit()我得到预期的输出:Setting valueGetting_valueOut[89]:73.4现在试图将温度设置为 -275,我们得到了预期的错误!c = Celsius()c.temperature=-275c.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 但由于某种原因它通过了它。
查看完整描述

2 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

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

self._temperature = temperature

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

self.temperature = temperature

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


查看完整回答
反对 回复 2021-06-08
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

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

现在,当您启动类时,该属性将使用,并且在错误输入中您将收到异常。


查看完整回答
反对 回复 2021-06-08
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信