【发布时间】:2016-04-17 02:31:28
【问题描述】:
documentation for Pickle 明确表示:
新样式类 C 的实例是使用以下方法创建的:
obj = C.__new__(C, *args)
试图利用这一点,我创建了一个没有实例属性或方法的单例:
class ZeroResultSentinel(object):
instance = None
def __new__(cls, *args):
if not cls.instance:
cls.instance = super(ZeroResultSentinel, cls).__new__(cls, *args)
return cls.instance
(该类在缓存层中用于区分无结果的结果和缓存中的任何内容。)
单例效果很好(每次调用ZeroResultSentinel() 都会在内存中产生相同的实例,ZeroResultSentinel() == ZeroResultSentinel() 的计算结果为True)。而且我可以腌制和取消腌制实例而不会出错。但是,当我解开它时,我得到了一个不同的实例。所以我在__new__ 中放置了一个断点。每次调用ZeroResultSentinel() 时我都会遇到断点,但是当我解开腌制的ZeroResultSentinel 时我不会遇到断点。这与文档直接矛盾。那么是我做错了什么,还是文档不正确?
【问题讨论】:
-
你指定了什么pickle协议?
标签: python deserialization instance pickle