我正在尝试创建一个类,该类将处理我在Python中的自定义文件类型。我希望它的行为就像字典一样,因此我扩展了内置dict
类,添加了open(实际上是__init__
)并保存了函数。结构如下:
{
'A': [
[1, 'Doe', 'John', '49396928593', '0', '23', '20'],
[2, 'Smith', 'Mark', '05926836832', '0', '6', '14'],
],
'B': [
# and so on
]
}
因此,它基本上是列表列表的字典。
现在,我想要一个类变量,当对象中发生任何更改时,changed
该变量将自动设置为该变量True
。显然,__setitem__
只有当直接更改字典中的项目时,我的班级才会被解雇。有没有办法捕捉我的词典子项的任何变化?
这是我的代码:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句