1

インスタンス変数でいくつかの計算を行っています。その後、計算を再度行う必要がないように、クラス インスタンスをピクルしたいと考えています。ここに例があります:

import cPickle as pickle

class Test(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.c = None
    def compute(self, x):
        print 'calculating c...'
        self.c = x * 2

test = Test(10, 'hello')
test.compute(6)

# I have computed c and I want to store it, so I don't have to recompute it again:

pickle.dump(test, open('test_file.pkl', 'wb'))

test.compute(6)何があるかを確認できた後test.__dict__

>>> test.__dict__
{'a': 10, 'c': 12, 'b': 'hello'}

それが漬け物になると思いました。でも、

クラスインスタンスをロードするとき:

import cPickle as pickle

from pickle_class_object import Test

t2 = pickle.load(open('test_file.pkl', 'rb'))

私はシェルでこれを見ます:

calculating c...

つまり、私はピクルスにしなかったcので、もう一度計算しています。

好きなようにピクルスにする方法はありtestますか?cだから、計算をやり直す必要はありません。ピクルするだけでよいことがわかりtest.__dict__ましたが、より良い解決策があるかどうか疑問に思っています。また、ここで何が起こっているのかについての私の理解は弱いので、何が起こっているのかについてのコメントは素晴らしいことです. __getstate__とについて読みまし__setstate__たが、ここで適用する方法がわかりません。

4

3 に答える 3

3

モジュールを再度インポートするpickle_class_objectと、Pythonはそのモジュール内のすべてのコードを実行します。

最上位のモジュール コードには への呼び出しが含まれており.compute()、これが呼び出されています。

pickle を作成するコードをモジュールから移動するか、if __name__ == '__main__':保護されたセクションに移動することができます。

if __name__ == '__main__':
    test = Test(10, 'hello')
    test.compute(6)

    pickle.dump(test, open('test_file.pkl', 'wb'))

メイン スクリプトが;に__name__設定されているときに python ファイルを実行する場合のみ。__main__モジュールとしてインポートする__name__と、代わりにモジュール名が設定され、ifブランチは実行されません。

于 2013-05-19T19:32:29.870 に答える
1

それは起こっていることではありません。モジュールをインポートすると実行される最上位のコードを含む python モジュールをインポートします。コードが意図したとおりに機能することがわかります。

import cPickle as pickle

class Test(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.c = None
    def compute(self, x):
        print 'calculating c...'
        self.c = x * 2

test = Test(10, 'hello')
test.compute(6)

pickle.dump(test, open('test_file.pkl', 'wb'))

t2 = pickle.load(open('test_file.pkl', 'rb'))
print t2.c


--output:--
calculating c...
12

コードが説明どおりに機能した場合、「calculating c...」が 2 回表示されます。

于 2013-05-19T19:39:27.660 に答える