python - pickling dict 继承类缺少内部值

标签 python dictionary python-3.x pickle

我已经对代码进行了一些尝试,显然失败的原因是在设置 'wham' 时,该值是类 TestDict 的另一个实例>只要我不尝试 pickle 和取消 pickle 它就可以正常工作。
因为如果我这样做 self.test 就会丢失。

回溯:

Traceback (most recent call last):
  File "test.py", line 30, in <module>
    loads_a = loads(dumps_a)
  File "test.py", line 15, in __setitem__
    if self.test == False:
AttributeError: 'TestDict' object has no attribute 'test'

代码:

from pickle import dumps, loads

class TestDict(dict):
    def __init__(self, test=False, data={}):
        super().__init__(data)
        self.test = test

    def __getitem__(self, k):
        if self.test == False:
            pass
        return dict.__getitem__(self, k)

    def __setitem__(self, k, v):
        if self.test == False:
            pass
        if type(v) == dict:
            super().__setitem__(k, TestDict(False, v))
        else:
            super().__setitem__(k, v)

if __name__ == '__main__':
    a = TestDict()
    a['wham'] = {'bam' : 1}
    b = TestDict(True)
    b['wham'] = {'bam' : 2}
    dumps_a = dumps(a)
    dumps_b = dumps(b)

    loads_a = loads(dumps_a)
    loads_b = loads(dumps_b)

    print(loads_a)
    print(loads_b)

如果不替换 __setitem____getitem__,代码就可以工作,但我想为这两个特定函数添加额外的功能。

我也尝试过:

class TestDict(dict):
    __module__ = os.path.splitext(os.path.basename(__file__))[0]

哪种工作有效,只要我不将 TestDict 嵌套在 TestDict 中,这意味着我不会替换 __setitem____getitem__ 在字典的子部分。

最佳答案

定义__reduce__方法:

class TestDict(dict):
    ...

    def __reduce__(self):
        return type(self), (self.test, dict(self))

关于python - pickling dict 继承类缺少内部值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18485160/

相关文章:

python & lxml : adding empty element into an etree

node.js - 如何修复 ‘Error: Can' 找不到 Python 可执行文件 "python",您可以设置 PYTHON 环境变量。” ubuntu Node js npm

python - Pyqt5 鼠标事件不适用于我的自定义选项卡栏

Python3.6 - 无法在 Windows 中导入 gensim

python - 如何从 Python 连接到 Netezza 数据库?

python - 将 alpha 添加到现有的 matplotlib 颜色图

使用 tkinter 的 Python 程序在 Windows 10 中立即关闭

C++ - '(' 标记之前的预期主表达式和 ‘(’ 标记之前缺少的模板参数

c# - 在 KeyCollection 上使用 IEnumerable.Except 与利用 Dictionary.ContainsKey 进行与性能相关的相互减法和交集

javascript - 精度较低的 GeoJSON