【发布时间】:2021-01-11 22:52:32
【问题描述】:
这可能无法按照我想要的方式完成。我在 python 中制作了class Temperature。
我想设置一个名为 temperature 的属性,并在不同的尺度(例如凯文、摄氏或华氏)上设置或检索其值。
设定温度:
T = Temperature()
T.temperature = 20 # Set temperature to 20ºC
T.temperature('Fahrenheit') = 68 # Set temperature to 68ºF
T.temperature('Kelvin') = 305 # Set temperature to 305K
获取温度:
t = T.temperature # retrieves temperature in Celsius
t = T.temperature('Fahrenheit') # retrieves temperature in Fahrenheit
t = T.temperature('Kelvin') # retrieves temperature in Kelvin
我有这个代码。首先,我尝试使用 @property 装饰器,但它不起作用。然后我决定改用传统语法,使用x=property(x_get, x_set)
class Temperature:
def __init__(self, temperature:float = 0, scale:str = "Celsius"):
# All temperatures will be stored as KELVIN
self._temperature = None
self.set_temperature(temperature, scale)
def get_temperature(self, scale: str = "Celsius"):
converter = {
"Celsius": self._temperature - 273.15,
"Fahrenheit": ((self._temperature - 273.15) * 1.8) + 32,
"Kelvin": self._temperature
}
value = converter.get(scale)
return value
def set_temperature(self, value: float, scale: str = "Celsius"):
converter = {
"Celsius": value + 273.15,
"Fahrenheit": (value - 32) / 1.8 + 273.15,
"Kelvin": value
}
self._temperature = converter.get(scale)
if self._temperature < 0 :
self._temperature = None
raise ValueError("Temperature below 0 Kelvin is not possible")
temperature = property(get_temperature, set_temperature)
但我不能使用建议的语法;虽然使用传统语法似乎是一个不错的方法。
在不带任何参数调用属性temperature或直接获取和设置带参数的方法时有效:
>>> T = Temperature(20) # Initialize
>>> T.temperature # Getter
20.0
>>> T.temperature=30 # Setter
>>> T.temperature # Getter
30.0
如果我直接打电话给get_temperature 或set_temperature 就可以了
>>> T.get_temperature("Fahrenheit")
86.0
但是,如果我使用参数调用 getter 或 setter 属性,则会引发错误:
T.temperature("Fahrenheit")
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'float' object is not callable
或者
T.temperature("Kelvin") = 301.15
File "<input>", line 1
SyntaxError: can't assign to function call
T.temperature = 68, 'Fahrenheit'
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 19, in set_temperature
TypeError: can only concatenate tuple (not "float") to tuple
【问题讨论】:
标签: python properties getter-setter