我目前正试图围绕Python属性。
假设我要在摄氏和开尔文之间转换。我有一个学位课程,处理这些计算:
class Degrees(object):
def __init__(self, celsius):
self.celsius = celsius
#Celsius
def set_celsius(self, celsius):
self._celsius = celsius
def get_celsius(self):
return self._celsius
celsius = property(fget=get_celsius, fset=set_celsius)
#Kelvin
def set_kelvin(self, kelvin):
self._kelvin = kelvin
def get_kelvin(self):
return self._kelvin
kelvin = property(fget=get_kelvin, fset=set_kelvin)
def to_kelvin(self):
self.kelvin = self.celsius + 273.15
return self.kelvin
def to_celcius(self):
self.celsius = self.kelvin - 273.15
return self.celsius
然后,我使用以下内容:
deg = Degrees(20) #Set celsius to 20
print ("In Kelvin {0:.3f}.").format(deg.to_kelvin()) #Works
deg.kelvin = 300 #Should alter celsius
print ("New celsius {0}").format(deg.celsius)
输出:
>>>> New celsius 20
对于最后一次打印,我期望26.850(新摄氏度值)。相反,我得到20(旧的)。也就是说,摄氏度值尚未更新。
我该如何解决这个问题?任何指针都非常感谢。
答案 0 :(得分:2)
您不应存储两个彼此依赖的独立属性。他们一定会失去同步。相反,选择一个规范值来存储,并来回转换。既然你从celcius开始,那么在整个过程中使用它可能是有意义的。
class Degrees(object):
def __init__(self, celsius):
self._celsius = celsius
#Celsius
def set_celsius(self, celsius):
self._celsius = celsius
def get_celsius(self):
return self._celsius
celsius = property(fget=get_celsius, fset=set_celsius)
#Kelvin
def set_kelvin(self, kelvin):
self._celsius = self.to_celsius(kelvin)
def get_kelvin(self):
return self.to_kelvin(self._celsius)
kelvin = property(fget=get_kelvin, fset=set_kelvin)
def to_kelvin(self, celsius):
return celsius + 273.15
def to_celsius(self, kelvin):
return kelvin - 273.15
答案 1 :(得分:1)
将set_kelvin
功能更改为 -
def set_kelvin(self, kelvin):
self._kelvin = kelvin
self._celsius = self.to_celcius()