5

ガベージコレクションを許可しながら、クラスインスタンスの追跡を処理する基本クラスを設定します。この投稿の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ませbc

誰かが何が起こっているのか手がかりを持っていますか?fromを明示的に継承すると、デフォルトと動作がobject壊れるように見えます。__getstate____setstate__

4

0 に答える 0