在Python dict子类中重写uu setitem uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;t设置内部项目的值

在Python dict子类中重写uu setitem uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;t设置内部项目的值,python,dictionary,subclass,Python,Dictionary,Subclass,我正在尝试创建一个类来处理Python中的自定义文件类型。我希望它能像字典一样工作,所以我扩展了内置的dict类,添加了open(实际上是\uuuuuu init\uuuu)和save函数。结构如下: { 'A': [ [1, 'Doe', 'John', '49396928593', '0', '23', '20'], [2, 'Smith', 'Mark', '05926836832', '0', '6', '14'], ], 'B': [ # and s

我正在尝试创建一个类来处理Python中的自定义文件类型。我希望它能像字典一样工作,所以我扩展了内置的
dict
类,添加了open(实际上是
\uuuuuu init\uuuu
)和save函数。结构如下:

{
  'A': [
    [1, 'Doe', 'John', '49396928593', '0', '23', '20'],
    [2, 'Smith', 'Mark', '05926836832', '0', '6', '14'],
  ],
  'B': [
    # and so on
  ]
}
所以它基本上是一个列表字典

现在我想要一个类变量,
changed
,当对象中的任何内容发生更改时,它将自动设置为
True
。显然,我的类的
\uuuuuu setitem\uuuuu
只有在直接在字典中的项发生更改时才会被激发。有没有办法捕捉字典子项的任何变化

这是我的密码:

import zlib
import json

class MRK(dict):

    def __init__(self, path):
        self.path = path
        self.changed = False

        fp = open(path, "r")
        compressed = fp.read()
        fp.close()      
        json_data = zlib.decompress(compressed)
        data = json.loads(json_data)
        super(MRK, self).__init__(data)

    def __setitem__(self, key, value):
        print "!"
        self.changed = True
        super(MRK, self).__setitem__(key, value)

    def save(self):
        json_data = json.dumps(self)

        compressed = zlib.compress(json_data)
        fp = open(self.path, "w")
        fp.write(compressed)
        fp.close()


f = MRK('dane.mrk')

for c in f:
    print c

    for std in f[c]:
        if std[1]=='Smith':
            std[1] = 'Brown'
        print std

print f.changed # outputs False

f.save()

不,没有;您必须为这些对象使用自定义列表对象,并将“changed”标志传播到父字典,或使用中心对象跟踪更改

一旦你从字典中检索到一个对象,字典本身就与它无关了;例如,您可以将该对象存储在单独的引用中,并在不涉及原始词典的情况下传递该对象

另一个选项是始终需要再次对对象进行显式设置:

lstobj = yourdict['A']
lstobj[1][1] = 'Sue'
# explicit set to notify `yourdict`
yourdict['A'] = lstobj

谢谢你的快速回答。现在我想知道如果我手动维护这个标志是否真的值得付出努力。你可以看看ZODB持久性包,因为它们还必须跟踪更改的对象
PersistentMapping
PersistentList
是自定义实现,将在
self
上设置更改标志,然后中央管理器将更改提交给ZODB,并向其注册。