我已经对代码进行了一些尝试,显然失败的原因是在设置 '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/