我已经玩了一些代码,显然失败的原因是当设置'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__
,这种工作方式有效字典。
答案 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
...