更新从float派生的类的值

时间:2014-02-21 17:01:35

标签: python

关注Python values with units,如果我有一个像float这样的派生类:

class float_with_units(float):
    def __new__(self,value,units):
        return float.__new__(self,value)

    def __init__(self,value,units):
        self.units = units

    def setval(self,newval):
        self = float_with_units(newval,self.units)

T = float_with_units(100,'C')
T.setval(200)
print T,T.units

该值不会更新。当我希望它返回“200.0 C”时,返回“100.0 C”。

为什么这不起作用,我应该做什么呢?

编辑 - 建议添加__str__方法的两个答案肯定能解决问题,但事实证明并不是我打算提出的问题。浮动格式对我而言不仅仅是一个字符串的价值 - 我希望能够用浮点数来计算,我不能用字符串做。例如,我想做这样的操作:

T = float_with_units(100,'C')
T2 = T+T

使用原始值可以正常工作,但我无法对其进行编辑,然后执行更多操作。

显而易见的解决方案是明确地使用T.value,但是将所有这些.value挂在我的代码中会使它很难阅读。

2 个答案:

答案 0 :(得分:0)

我认为你想要这样的东西:

class float_with_units(float):
    def __new__(self,value,units):
        return float.__new__(self,value)

    def __init__(self,value,units):
        self._units = units
        self._value = value

    def setval(self,value):
        self._value = value

    def __str__(self):
        return '%f %s' % (self._value, self._units)            

T = float_with_units(100,'C')
T.setval(200)
print T

生成:200.000000 C

答案 1 :(得分:0)

Python中的不可变(子)类不能在您的问题中使用setval()之类的方法。相反,你需要沿着这些方向做点什么:

class FloatWithUnits(float):
    def __new__(cls, value, units):
        inst = super(FloatWithUnits, cls).__new__(cls, value)
        inst.units = units
        return inst

    def withval(self, newval):
        return FloatWithUnits(newval, self.units)

T = FloatWithUnits(100, 'C')
T = T.withval(200)
print T, T.units  # 200.0 C

子类化不可变类型的优点是你可以在它们的基类所在的任何地方使用它们,这在与其他无法更改为接受新类型的代码交互时通常很有用,就像大多数现有的第三方一样模块。