我正在尝试编写一个Python程序,在该程序中捕获属性的更新,以便稍后更新所有更改的GUI或进行其他处理。现在,我正在使用一个实现描述符协议的类的示例来捕获观察到的属性中的所有更改,这工作得很好。
我想要改变/改进的是将ObservedAccess的示例,如下面TestObserving类中所示,移动到装饰器中,类似于这样:@observableclass(some_int,some_string)class 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()
我甚至不知道如何从装饰者开始做到这一点。我想我的绊脚石是如何将示例的“名称”传递给装饰器函数,除非我将它们作为真字符串传递,这看起来很尴尬。
1条答案
按热度按时间lvmkulzt1#
这是你需要的吗