如何设置字典值使其表现得与实例属性类似?

时间:2019-04-16 14:14:06

标签: python class

我想将许多温度值存储为字典实例属性。每当使用字典键时,我都希望更新相应的值,其行为类似于实例@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'])

上面显示的outsideinside温度在访问时不会改变,尽管它当然适用于基本属性c。是在这种情况下,我需要创建一个dict子类,还是有另一种方法呢? 我可以辞职为每个温度设置单独的实例属性,但是我认为它在字典中更加整洁,并且渴望查看是否有实现此目的的方法。

2 个答案:

答案 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...