继承''对象'中断__getstate__& __setstate__?

时间:2013-02-01 03:04:14

标签: python object pickle

设置基类以处理类实例的跟踪,同时仍允许垃圾回收。此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进入列表但abc没有。

任何人都有线索是怎么回事?似乎明确继承object会破坏默认的__getstate____setstate__行为。

0 个答案:

没有答案