如何在装饰器中创建 Python 描述符的实例?

问题描述 投票:0回答:0

我正在尝试编写一个 Python 程序,我可以在其中捕获对属性的更新,因此我可以稍后为所有更改更新 GUI,或进行其他处理。 现在,我正在使用一个实现描述符协议的类的实例来捕获观察到的属性的所有变化,效果很好。

我想更改/改进的是将 ObservedAccess 的实例(如下面的 TestObserving 类中所示)移动到装饰器中,如下所示: @observableclass(some_int, some_string) 类 TestObserving

并在装饰器中创建所需的 ObservedAccess 实例。

感谢任何信息或想法,保罗。

# dummy observer method
def changed(instance, private_name):
    print(f'instence: {instance}, attribute: {private_name} changed')

class ObservedAccess:
    def __set_name__(self, owner, name):
        self.public_name = name
        self.private_name = '_' + name

    def __get__(self, obj, object_type=None):
        value = getattr(obj, self.private_name)
        return value

    def __set__(self, obj, value):
        setattr(obj, self.private_name, value)
        # let observers know the instance has changed
        changed(obj, self.private_name)

class TestObserving:
    some_string = ObservedAccess()
    some_int = ObservedAccess()

    def __init__(self):
        self.some_string = "Today is a demo day"
        self.some_int = 5

if __name__ == '__main__':
    t = TestObserving()

我什至不知道如何从装饰器开始做这件事。我想我的绊脚石是如何将实例的“名称”传递给装饰器函数,除非我将它们作为真正的字符串传递,这看起来很尴尬。

python decorator descriptor
© www.soinside.com 2019 - 2024. All rights reserved.