【问题标题】:Object property with extra functions in PythonPython中具有额外功能的对象属性
【发布时间】:2020-08-24 03:17:38
【问题描述】:

我正在根据@property 的想法开发一个描述符。我想了解是否有任何方法可以轻松地将属性的行为扩展到设置/获取之外。

具体示例:我正在与设备通信,并希望有一个可以设置/获取/更新的属性。这样,当我set时,我将新值传递给设备,并将其存储在缓存中。当我get 时,我检索缓存的值。当我update 时,设备被重新询问该值。这样,可以避免与设备进行不必要的通信,除非明确触发。

我不知道是否有我遗漏的模式可能是一个简单的解决方案。一个选项是在set 中使用特殊值时使缓存无效,但我认为假设触发更新的特定值不是一个好主意。

【问题讨论】:

  • 我的意思是,你的get 函数本质上会包含这种逻辑。这是一个例子:github.com/pyglet/pyglet/blob/… 非常依赖于此。您的set 可以检查值/键是否已存在并采取相应措施。
  • 看起来不像我要找的东西。我看不到他们在获取时如何实施更新,他们在设置时正在更新。我会扩展我的问题。
  • 即使有一种方法可以像您描述的那样扩展属性功能,使用该附加功能的语法是什么样的?假设a 是类A 的一个属性,那么b = A.a 调用a.getter,而A.a = b 调用a.setter。您建议调用“updater”的语法是什么?
  • 这就是我要问的,有没有办法?例如,del 触发一个特殊的方法。也许有一个upd。或者也许描述符不是要走的路,还有另一种我不知道的方法。或者也许有办法知道get 是否被额外的.update 访问?
  • 对不起,我不明白您的getterupdater 之间的区别。如果你想让你的 updater 有自己的语法,你需要定义一个新的操作符。

标签: python caching properties descriptor


【解决方案1】:

我仍然不明白您的getterupdater 之间的区别,但这里有一些示例代码,它实现了一个存储先前变量值的缓存。也许这可以帮助您找到您正在寻找的东西。

class A:
    def __init__(self):
        self._a_cache = [1]

    @property  # <- this defines a.getter
    def a(self):
        return self._a_cache[-1]

    @a.setter
    def a(self, value):
        self._a_cache.append(value)

    def undo(self):
        if len(self._a_cache) > 1:
            self._a_cache.pop()
        else:
            print('No previous values')

    def update(self):
        # what is supposed to happen here as opposed to the getter?
        pass
        
        
var = A()
print(var.a)

var.a = 10
print(var.a)

var.undo()
print(var.a)

var.update()
# ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2020-12-18
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多