2011-08-16 27 views
1

私はPythonでEmail()クラスを使って作業していますが、SerializeEmail()クラスに拡張したいと思います。 .read_email()。 、私はJSONエンコード/デコード処理をナビゲートしている、と私は成功した私のSerializeEmail()オブジェクトを書き、それを読むことができますPython "json"モジュールを使用してクラスをシリアライズ可能にする

# define email 
my_email = SerializeEmail() 
my_email.recipients = '[email protected]' 
my_email.subject = 'RE: Master sword' 
my_email.body = "Master using it and you can have this." 
# write email to file system for hand inspection 
my_email.write_email('my_email.txt') 
... 
# Another script reads in email 
my_verified_email = SerializeEmail() 
my_verified_email.read_email('my_email.txt') 
my_verified_email.send() 

しかし、私は満足を見つけることができません:私は行動のこの種をしたいと思います私のオブジェクトをSerializeEmail.read_email()呼び出しで再作成する方法です。ここでの問題

class SerializeEmail(Email): 

    def write_email(self,file_name): 

     with open(file_name,"w") as f: 
      json.dump(self,f,cls=SerializeEmailJSONEncoder,sort_keys=True,indent=4) 

    def read_email(self,file_name): 

     with open(file_name,"r") as f: 
      json.load(f,cls=SerializeEmailJSONDecoder) 

は私のread_emailでjson.load()呼び出しは()メソッドは、私のSerializeEmailオブジェクトのインスタンスを返すということですが、私が使用している現在のインスタンスにそのオブジェクトを割り当てることはありません。あれを呼べ。だから、今、私は、このような何かをする必要があると思います

another_email = my_verified_email.read_email('my_email.txt') 

()の呼び出しがmy_veridied_email.read_emailするために、ファイル上のデータとmy_verified_emailの現在のインスタンスを移入するために私がしたいことはある

。私は試しました

self = json.load(f,cls=SerializeEmailJSONDecoder) 

しかし、それは動作しません。返されたオブジェクトの個々の要素を自分の「自己」オブジェクトに割り当てることはできますが、それは臨時のものではないように思えますし、もし存在すればこれを行うための「正しい方法」を探しています。助言がありますか?私の全体的なアプローチに欠陥があると思って、このタスクを達成する別の方法をお勧めするなら、私のためにそれをスケッチしてください。

答えて

2

既存のインスタンスにシリアル化されたコンテンツをロードするためにいくつかのフープを飛び越えることができますが、そうすることはお勧めしません。それは本当にあなたに何も得られない不要な合併症です。 JSONから電子メールをロードするたびに、ダミーインスタンスを作成する余分な手順が必要になることを意味します。ファクトリクラスまたはファクトリメソッドを使用してシリアル化されたJSONから電子メールをロードし、新しいインスタンスとして返すことをお勧めします。私の個人的な好みは、次のようにあなたが達成したいた、ファクトリメソッドのようになります。

class SerializeEmail(Email): 

    def write_email(self,file_name): 

     with open(file_name,"w") as f: 
      json.dump(self,f,cls=SerializeEmailJSONEncoder,sort_keys=True,indent=4) 

    @staticmethod 
    def read_email(file_name): 

     with open(file_name,"r") as f: 
      return json.load(f,cls=SerializeEmailJSONDecoder) 

# You can now create a new instance by simply doing the following: 
new_email = SerializeEmail.read_email('my_email.txt') 

はあなたに渡される任意の暗黙の第一引数なしでクラスにメソッドを呼び出すことができます@staticmethodデコレータを、注意してください。通常の工場。メソッドは@classmethodとなりますが、JSONからオブジェクトをロードするので、暗黙のクラス引数は不要です。

JSONから別のオブジェクトをロードする前に、この変更を使用してSerializeEmailオブジェクトをインスタンス化する必要はありません。メソッドをクラスで直接呼び出すだけで、目的の動作を得ることができます。

関連する問題