私は別の時間に保存して再ロードしたいオブジェクトの辞書を作成しています( "json"モジュールでこれをやりたい、ピクルス ")。__dict__ Pythonでメソッド呼び出しを許可しない
私は1つのクラスを作成しました( "Ball"と呼んでください)、そのクラスの多くの異なるインスタンスが辞書に含まれています。それが見える方法は次のとおりです。
my_dict = {
"ball1": {"size": "big", "baseball": False, etc...},
"ball2": {"size": "small", "baseball": True, etc...},
etc...
}
"ボール"クラスの新しいインスタンスを作成するとき、私は単にそれらを "my_dict"に追加します。
changeSize(self, size)
問題:
私が動作するように保存能力を取得するためには
私の「ボール」のクラスは、私は特定のフィールド...すなわちの値を変更できるようにするメソッドを持っています適切に私は「ボール」クラスのそれぞれの新しいインスタンスに次の操作を実行しなければならなかったのJSONモジュールと:
を追加newBall = Ball(name)
my_dict[name] = newBall.__dict__
それを辞書に追加するとJSONはシリアライズ可能になりますが、「編集モード」に入るとメソッド(changeSize(name))を呼び出すことができなくなります辞書であり、もはや「ボール」オブジェクトではない。
私は(jsonモジュールを使用して)保存し、編集するために使用しているメソッドも使用できるようにするにはどうすればよいですか?
また、私が保存しています方法は、/ロードは次のとおりです。
out_file = open("testSave.json"), "w")
json.dump(my_dict, out_file, indent=4)
out_file.close()
in_file = open("testSave.json", "r")
my_dict = json.load(in_file)
in_file.close()
感謝を!
'Ball'コンストラクタは最小限の名前を必要とします(しかし、プログラムではそれが起こるように促されます)。あなたが基本的に同じことをやっていたら、私はすでにそれがうまくいく「ピクルス」でやっているのですか?私はそれが安全性が低いことを知っています、そして、それが私がjsonの方法を学ぼうとしていた理由です。また、私が 'json'を続けると、なぜ'デコレータ 'を使うのかを簡単に説明できますか?私はそれらをよく理解していません。どうもありがとう! – AmericanMade
@AmericanMade - あなたは 'b = cls(dictionary.get( 'name'))'やそれに類するものを実行できるかもしれません。 Re: 'pickle' - 確かにそこにセキュリティ問題があります。あなたが完全にそれを信用しないと、何かをunpickleしないでください。 '@ classmethod'に関しては、' from_json'の 'cls'がクラスのインスタンスではなく_class_であるようにしています。 – mgilson