如何pickle从di派生的python对象

2024-05-17 02:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的课,我需要泡菜:

class sdict(dict):
    def __getattr__(self, attr):
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__
    __reduce__ = dict.__reduce__

在我看来,__reduce__应该负责酸洗,但是:

^{pr2}$

我应该也定义__getstate__?我完全不知道这些可以用于自定义酸洗的多种方法:__getinitargs____getstate____reduce__,等等。。。在

谷歌只提到了我觉得不太清楚的官方pickle文档。有人能帮我澄清一下吗?或者给我介绍一个好的泡菜教程吗?在


Tags: selfnonereducegetreturndefdictclass
1条回答
网友
1楼 · 发布于 2024-05-17 02:37:07

我怀疑你是否走上了一条好路。在

但是,要解决泡菜问题:

class sdict(dict):
    def __getattr__(self, attr):
        if attr.startswith('__'):
            raise AttributeError
        return self.get(attr, None)
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

Pickle试图从对象获取状态,dict没有实现它。您的__getattr__正在用"__getstate__"调用以找到该魔术方法,并返回None,而不是按应该的方式提高AttributeError。如果修复了__getattr__,pickle将正常工作。在

事实上,为什么要为丢失的属性返回None?这真的是你想要你的对象做的吗?在

这是一个很难伪造内置软件的例子。隐藏着一些微妙的事情,你必须参与其中。在

注:安identical question。在

相关问题 更多 >