オブジェクトのサブクラスをピクルして、そのスーパークラスの変数のみをキャプチャする (そしてオブジェクトをスーパークラスに変換する) にはどうすればよいですか。
私がこれを行っている理由は、「クラス」を作成するために必要な追加情報があるが、それを読むときに軽量バージョンが必要だからです。
例:
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 __ 情報を書くことにオープンです。
__ getstate __ を使用する場合、クラス A に割り当てた変数のみを自動的に保存する方法はありますか? だから私は自分自身を言う必要はありません。__口述__ ['b']
pickle only A 情報または pickle B 情報 (クラス B が与えられた場合) のように、必要なバージョンを選択できる特別なメソッドを作成できますか?
副次的な質問: この場合、__ setstate __ を定義する必要がありますか? または __ getstate __ を単独で使用しますか?
また、ここでオブジェクト指向の構造がひどいことに気づきました。それについての指針は気にしません。