Python - 属性和更新属性值

时间:2015-09-18 11:35:46

标签: python properties attributes

我目前正试图围绕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(旧的)。也就是说,摄氏度值尚未更新。

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

2 个答案:

答案 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()