0

オブジェクトのサブクラスをピクルして、そのスーパークラスの変数のみをキャプチャする (そしてオブジェクトをスーパークラスに変換する) にはどうすればよいですか。

私がこれを行っている理由は、「クラス」を作成するために必要な追加情報があるが、それを読むときに軽量バージョンが必要だからです。

例:

import cPickle
def unpickle_me(filename):
    myobj= cPickle.load( open( filename, "rb" ) )
    return myobj

def pickle_me(obj, filename):
    cPickle.dump(obj, open( filename, "wb" ) )

class A(object):
    def __init__(self):
        self.a = []

    def read_index(self, index):
        return self.a[index]

class B(A): 
    def __init__(self, b):
        super(B, self).__init__()
        self.b = b; # let b = 3 for example

    def add_to_super(self, avar):
        self.a.append(avar*self.b)

classB = B(3)
classB.add_to_super(5)
pickle_me(classB, 'me_b.pickle')
myobj = unpickle_me('me_b.pickle')
print(type(myobj), myobj.__dict__) 
>>>> (<class '__main__.B'>, {'a': [15], 'b': 3})

だからピクルスが効く!そして、それは私が期待するものを漬けます。しかし、実際には、次のようなものが必要です。

pickle_me(classB, 'me_b.pickle')
myobj = unpickle_me('me_b.pickle')
print(type(myobj), myobj.__dict__)
>>>> (<class '__main__.A'>, {'a': [15]})  # class A and only has A

おまけとして、それを開いた人は誰でも、私の「add_to_super」を介してAに別の値を「追加」することはできません。

質問: 1. これを行う方法はありますか? クラス A とクラス B の両方で __ getstate __ 情報を書くことにオープンです。

  1. __ getstate __ を使用する場合、クラス A に割り当てた変数のみを自動的に保存する方法はありますか? だから私は自分自身を言う必要はありません。__口述__ ['b']

  2. pickle only A 情報または pickle B 情報 (クラス B が与えられた場合) のように、必要なバージョンを選択できる特別なメソッドを作成できますか?

  3. 副次的な質問: この場合、__ setstate __ を定義する必要がありますか? または __ getstate __ を単独で使用しますか?

  4. また、ここでオブジェクト指向の構造がひどいことに気づきました。それについての指針は気にしません。

4

2 に答える 2

0

プロトコルを使用して__reduce__、クラスのインスタンスの代わりに何をピクルするかを指定し__setstate____getstate__常に元のクラスを操作できます。Aしたがって、 のインスタンスがある場合は常にのインスタンスをピクルしたい場合はB、次のようになります。

class B(A): 
    def __init__(self, b):
        super(B, self).__init__()
        self.b = b; # let b = 3 for example

    def add_to_super(self, avar):
        self.a.append(avar*self.b)

    def __reduce__(self):
        return A, (), {'a': self.a}
于 2013-10-11T20:12:37.490 に答える