【问题标题】:Python - Property and updating attribute valuesPython - 属性和更新属性值
【发布时间】:2015-12-15 13:07:04
【问题描述】:

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

我该如何解决这个问题?任何指针都受到高度赞赏。

【问题讨论】:

    标签: python properties attributes


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多