酸洗dict继承类缺少内部值

时间:2013-08-28 10:17:45

标签: python dictionary python-3.x pickle

我已经玩了一些代码,显然失败的原因是当设置'wham'时,该值是类TestDict的另一个实例,只要我工作正常不要试图腌制和去除它 因为如果我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__,这种工作方式有效字典。

2 个答案:

答案 0 :(得分:3)

定义__reduce__方法:

class TestDict(dict):
    ...

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

答案 1 :(得分:1)

问题是pickle在进行上瘾时没有调用对象的__init__方法,因此self.test变量在创建时不会被创建尝试设置字典的项目。

在设置字典项后,显然设置了属性。

解决它的一种方法是添加一个将在实例中重写的类级别属性:

class TestDict(dict):
    test = False
    ...