需要有关Python描述符功能的帮助

时间:2019-02-20 20:51:12

标签: python python-descriptors

我正在尝试使用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

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

3 个答案:

答案 0 :(得分: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

我假设您还需要其他东西,但是我不知道您可能想要什么。从代码中获得的输出是完全合理的。

答案 1 :(得分:0)

摄氏温度等级:     def 获取(自身,实例,所有者):         返回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

答案 2 :(得分:0)

问题是,当您向fahrenheit分配内容时,__set__()的{​​{1}}方法将Fahrenheit委托给instance.celsiusCelsius上的所有方法都转换为float。如果您希望自己的示例按预期工作,则需要Celsius委派给instance.fahrenheit,而仍然进行float转换,也许仅在__get__()中那就是你想要的。

因此,总而言之,以Fahrenheit类型存储而不进行类型转换,并从Fahrenheit委托给Celsius

正如其他人所指出的那样,您的描述符设计使得Temperature的所有实例将存储相同的值。如果您希望不同的实例保存不同的值,则需要将值直接保存在该实例上的名称(通常为_fahrenheit)下,也可以保存在该字典中键是instance

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