设置基类以处理类实例的跟踪,同时仍允许垃圾回收。此second answer中的post已关闭,但在从已保存的实例中取消选中时,我还需要添加到instances
列表。
这是我的代码:
import weakref
import pickle
from pprint import pprint
import copy
class BaseClass(object):
def __new__(cls, *args, **kwargs):
instance = object.__new__(cls, *args, **kwargs)
if 'instances' not in cls.__dict__:
cls.instances = []
cls.instances.append(weakref.ref(instance))
return instance
def __getstate__(self):
print "pickling"
d = self.__dict__
return d
def __setstate__(self, state):
print "unpickling"
self.__dict__ = state
if 'instances' not in self.__dict__:
self.instances = []
self.__class__.instances.append(weakref.ref(self))
return self
BaseClass.instances = []
if __name__ == '__main__':
a = BaseClass()
b = BaseClass()
c = BaseClass()
pprint(BaseClass.instances)
f = file("test.pkl","wb")
pickle.dump(c,f)
f.close()
f = file("test.pkl","rb")
d = pickle.load(f)
f.close()
pprint(BaseClass.instances)
所以,奇怪的是:“unpickling”永远不会打印出来,d
实例没有进入instances
列表,表明__setstate__
永远不会被调用。
如果我将d = pickle.load(f)
替换为d = copy.copy(pickle.load(f))
,则d
将其置于instances
列表中,并且“pickling”打印两次而不是一次。
如果我将class BaseClass(object):
替换为class BaseClass:
,则会按预期“腌制”和“取消”每次打印一次,d
进入列表但a
,b
和c
没有。
任何人都有线索是怎么回事?似乎明确继承object
会破坏默认的__getstate__
和__setstate__
行为。