我想将许多温度值存储为字典实例属性。每当使用字典键时,我都希望更新相应的值,其行为类似于实例@property
装饰器的行为。
有没有一种方法可以不更新整个字典?下面是我希望它如何发布的代码,具有简化的更新功能(真正的功能将从传感器读取),但是每次访问时都需要更新温度。
import random
class Thermal():
def __init__(self):
self.temperatures = {'outside': self.outside, 'inside': self.inside}
@property
def outside(self):
return random.random()
@property
def inside(self):
return 1 + random.random()
@property
def c(self):
return random.random()
a = Thermal()
print(a.temperatures['outside'])
print(a.temperatures['outside'])
print(a.temperatures['inside'])
print(a.temperatures['inside'])
上面显示的outside
和inside
温度在访问时不会改变,尽管它当然适用于基本属性c
。是在这种情况下,我需要创建一个dict子类,还是有另一种方法呢?
我可以辞职为每个温度设置单独的实例属性,但是我认为它在字典中更加整洁,并且渴望查看是否有实现此目的的方法。
答案 0 :(得分:2)
只需对代码进行最少的更改,并保持a.temperatures['outside']
之类的语义,这是可能的解决方案:
import random
class Temperatures(): # here
def __init__(self, thermal):
self.thermal = thermal
def __getitem__(self, item):
return getattr(self.thermal, item)
class Thermal():
def __init__(self):
self.temperatures = Temperatures(self) # and here
@property
def outside(self):
return random.random()
@property
def inside(self):
return 1 + random.random()
@property
def c(self):
return random.random()
a = Thermal()
print(a.temperatures['outside'])
print(a.temperatures['outside']) # will give different random number
print(a.temperatures['inside'])
print(a.temperatures['inside'])
答案 1 :(得分:1)
怎么样?
class Thermal:
def __init__(self):
self._temperatures = {'inside': None, 'outside': None}
def __getitem__(self, key):
self.update()
return self._temperatures[key]
def update(self):
# update temperatures here...