ガベージコレクションを許可しながら、クラスインスタンスの追跡を処理する基本クラスを設定します。この投稿の2番目の回答は近いですが、保存されたインスタンスから選択を解除するときにもリストに追加する必要があります。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
、「ピクルス」は1回ではなく2回印刷されます。
に置き換えるclass BaseClass(object):
とclass BaseClass:
、期待どおりにそれぞれの「ピクルス」と「アンピクルス」が1回印刷さd
れ、リストに追加されますが、、、および作成されa
ませb
んc
。
誰かが何が起こっているのか手がかりを持っていますか?fromを明示的に継承すると、デフォルトと動作がobject
壊れるように見えます。__getstate__
__setstate__