在Python dict子类中覆盖__setitem__不适用于设置内部项目的值

米科拉杰·罗兹瓦多夫斯基

我正在尝试创建一个类,该类将处理我在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()
马丁·彼得斯(Martijn Pieters)

不,那里没有; 您将必须使用自定义列表对象,并将“ changed”标志传播到父词典,或者使用中央对象来跟踪更改。

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

另一个选择是始终总是在对象上再次需要一个显式设置:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python3中释放通过__setitem__验证的'dict'的子类?

来自分类Dev

PyDev不适用于Python 3.2

来自分类Dev

Python MySQL DB executemany不适用于一个值

来自分类Dev

属性错误:python中的exp,适用于某些功能,不适用于其他功能

来自分类Dev

高斯拟合不适用于Python

来自分类Dev

scikit-learn仅适用于python 2,而不适用于python 3

来自分类Dev

Python插值不适用于行

来自分类Dev

python爬虫不适用于asyncio

来自分类Dev

Notepad ++不适用于Python

来自分类Dev

python中的+ =运算符,用于__setitem__(加了方括号)

来自分类Dev

单击不适用于python硒

来自分类Dev

docker中的端口映射不适用于python服务器

来自分类Dev

Python manage.py runserver不适用于项目(Django)

来自分类Dev

for循环不适用于python中的空数据框

来自分类Dev

网格方法不适用于python中的时钟

来自分类Dev

Python np.append不适用于numpy.ndarray类型的字典值

来自分类Dev

Webdriver不适用于Selenium(Python)

来自分类Dev

为什么__dir __()不适用于python中的模块?

来自分类Dev

PyDev不适用于Python 3.2

来自分类Dev

PyQuery Python不适用于for循环

来自分类Dev

Python3-对于dict来说,读取文件行并不适用于所有项目

来自分类Dev

Scikit-learn仅适用于python 2,而不适用于python 3

来自分类Dev

Python字典不适用于'pass'

来自分类Dev

适用于pandas Dataframe中每个值的Python divmod

来自分类Dev

python中的Textblob模块不适用于我

来自分类Dev

python regex适用于regex101但不适用于python2

来自分类Dev

python设置文字不适用于列表来创建集合

来自分类Dev

Zamzar API 不适用于 python dict

来自分类Dev

windows API 不适用于 python3,但适用于 python 2

Related 相关文章

热门标签

归档