2015-09-18 122 views
0

我目前正试图围绕Python属性进行包装。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(老)。也就是说,摄氏温度值尚未更新。

我该如何解决这个问题?任何指针都非常感谢。

回答

1

更改set_kelvin功能 -

def set_kelvin(self, kelvin): 
    self._kelvin = kelvin 
    self._celsius = self.to_celcius() 
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