我正在尝试使用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
请帮助我应该在哪里更改或是否有其他更好的方法。
答案 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.celsius
。 Celsius
上的所有方法都转换为float
。如果您希望自己的示例按预期工作,则需要Celsius
委派给instance.fahrenheit
,而仍然进行float
转换,也许仅在__get__()
中那就是你想要的。
因此,总而言之,以Fahrenheit
类型存储而不进行类型转换,并从Fahrenheit
委托给Celsius
。
正如其他人所指出的那样,您的描述符设计使得Temperature
的所有实例将存储相同的值。如果您希望不同的实例保存不同的值,则需要将值直接保存在该实例上的名称(通常为_fahrenheit
)下,也可以保存在该字典中键是instance
。
最后,对于这种情况,在两个描述符之间共享一个值,并且它们不太可能在其他地方重用,我会走property
路线。