-3

我正在尝试使用 python 描述符解决问题。代码如下

class Celsius( object ):
    def __init__( self, value=0.0 ):
        self.value= float(value)
    def __get__( self, instance, owner ):
        return float(self.value)
    def __set__( self, instance, value ):
        self.value= float(value)

class Fahrenheit( object ):
    def __get__( self, instance, owner ):
        return (instance.celsius * 9 / 5 + 32.0)
    def __set__( self, instance, value ):
        instance.celsius= (float(value)-32.0) * 5 / 9

class Temperature( object ):
    def __init__(self, fahrenheit):
        self.fahrenheit = fahrenheit

    fahrenheit = Fahrenheit()
    celsius = Celsius()

t1 = Temperature(32)
print(t1.fahrenheit, t1.celsius)
t1.celsius = 0
print(t1.fahrenheit, t1.celsius)

预期的 O/P 是

32 0.0
32.0 0.0

但我明白了

32.0 0.0
32.0 0.0

请帮助我应该在哪里更改或者是否有其他更好的方法。

4

3 回答 3

0

问题是,当您将某些内容分配给 时,委托给fahrenheit__set__()方法。转换为的所有方法。如果您希望您的示例按预期工作,则需要在仍然进行转换的同时委托给,也许只有在您想要的情况下。Fahrenheitinstance.celsiusCelsiusfloatCelsiusinstance.fahrenheitfloat__get__()

所以,总而言之,存储在Fahrenheit类型中而不进行类型转换,并委托给Fahrenheitfrom Celsius

正如其他一些人所指出的,您的描述符设计使得所有实例都Temperature将存储相同的值。如果您希望不同的实例保存不同的值,则需要将值直接保存在实例上以不同的名称(通常是_fahrenheit在这种情况下)或键为instance.

最后,对于这种在两个描述符之间共享一个值并且它们不太可能在其他地方重用的情况,我会走这property条路。

于 2019-02-25T05:28:08.977 回答
0

没有解释为什么你想要你想要的输出......只是你想要那个输出,你可以通过将代码的最后四行更改为:

t1 = Temperature(32)
print(int(t1.fahrenheit), t1.celsius)
t1.celsius = 0
print(t1.fahrenheit, t1.celsius)

输出:

32 0.0
32.0 0.0

我假设您想要除此之外的其他东西,但我无法弄清楚您可能想要什么。您从代码中获得的输出是完全合理的。

于 2019-02-20T21:43:47.923 回答
0

摄氏度类:def get (self, instance, owner): return 5 * (instance.fahrenheit - 32) /9

def __set__(self, instance, value):
    instance.fahrenheit = 32 + 9 * value/5

类温度:摄氏度=摄氏度()

def __init__(self, initial_f):
    self.fahrenheit = initial_f
于 2019-02-21T20:09:47.443 回答