我有一个对象,它将在第一次使用后被缓存。我将使用 cPickle 模块来完成此操作。如果模块已经缓存,当我尝试下次(在另一个进程中)实例化该对象时,我想使用缓存的对象。以下是我的基本结构:
import cPickle
class Test(object):
def __new__(cls, name):
if name == 'john':
print "using cached object"
with open("cp.p", "rb") as f:
obj = cPickle.load(f)
print "object unpickled"
return obj
else:
print "using new object"
return super(Test, cls).__new__(cls, name)
def __init__(self, name):
print "calling __init__"
self.name = name
with open("cp.p", "wb") as f:
cPickle.dump(self, f)
Run Code Online (Sandbox Code Playgroud)
问题是,当我在__new__方法中取消缓存的对象时,它会调用__init__并重新初始化所有内容。有趣的是,似乎__init__不是在 unpickle 之后调用,而是在返回 unpickle 对象时调用。我添加了一个打印语句来显示这一点(“对象未腌制”)。
我有一个 hacky 解决方法,将以下检查添加到__init__:
intiailzed = False
...
...
def __init__(self, name): …Run Code Online (Sandbox Code Playgroud)