19

私はこれらのクラスを持っています:

class Family(object):
    __slot__ = ['father', 'var1']
    def __init__(self, father, var1 = 1):
        self.father, self.var1 = father var1

class Father(object):
    __slots__ = ['var2']
    def __init__(self, var2 = ''):
        self.var2 = var2

father = Father()
family = Family(father = father)

そして、私は「家族」オブジェクトを漬けたいです。__getstate__そのため、__setstate__ 「Family」クラスと「Father」クラスをオーバーライドする必要があります。

これを行う効率的な方法を教えてください。(私が使用する理由__slots__は、オブジェクトがたくさんあり、メモリを節約しようとしているためです)

4

1 に答える 1

24

__getstate__インスタンスを再構築するのに十分な情報を含む選択可能なオブジェクト(タプルなど)を返す必要があります。

__setstate__同じオブジェクトを受け取ることを期待し、それを使用してインスタンスを再構成する必要があります。

例えば:

import cPickle as pickle

class Family(object):
    __slots__ = ['father', 'var1']
    def __init__(self, father, var1 = 1):
        self.father, self.var1 = father, var1
    def __getstate__(self):
        return self.father, self.var1
    def __setstate__(self, state):
        self.father, self.var1 = state

foo = Family('father',1)
foo.var1 = 2
foo_pickled = pickle.dumps(foo)
foo2 = pickle.loads(foo_pickled)
print(repr(foo2))
# <__main__.Family object at 0xb77037ec>

print(foo2.var1)
# 2
于 2012-09-27T19:27:24.367 に答える