gpt4 book ai didi

python - 记录对 python 对象数据成员中元素的访问

转载 作者:太空狗 更新时间:2023-10-30 02:49:24 25 4
gpt4 key购买 nike

我想知道我的 Python 对象中的数据字段是否因为某个事件而被修改。我以为我会实现这个使用如下属性:

class C(object):

def get_scores(self):
print 'getter'
return self.__scores

def set_scores(self, value):
print 'setter'
self.__scores = value
self.__scoresWereChanged = True

scores = property(get_scores, set_scores, None, None)

def do_something(self):
if self.__scoresWereChanged:
self.__updateState() #will also set self.__scoresWereChanged to False
self.__do_the_job()

如果 scores 是不可变的,这种方法很有效,但 scores 是一个列表,我更改了其中的单个元素,该方法失败了:

In [79]: c.scores = arange(10)
setter

In [80]: print c.scores
getter
Out[80]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [81]: c.scores[3] = 999
getter #setter was not called

我可以解决这个问题

In [84]: s = c.scores
getter

In [85]: s[3] = 2222

In [86]: c.scores = s
setter

但是,当然这不会像我想要的那样优雅。

最佳答案

我会说没有任何简单的解决方案。

如果您打算像示例中那样使用列表,那么您需要子类化 list 并且至少提供您自己的 __setitem__ 方法实现允许监视列表更改。有关其他方法也被覆盖的完整示例,请查看 urwid library代码。特别是,monitored_list.MonitoredList 实现了类似的功能。

除此之外,您可能还想看看在代码中定义属性的替代方法,以便在属性更新时提供通知事件,如 traitsgobject (真的很老的教程,但仍然很容易理解)。

关于python - 记录对 python 对象数据成员中元素的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8397861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com