LoginSignup
2
2

More than 5 years have passed since last update.

インスタンス内変数の辞書化ー>シリアライズ・デシリアライズ

Last updated at Posted at 2016-02-22

オブジェクトのシリアライズ・デシリアライズ関連メモ
pythonのオブジェクト指向関連の表現が違ったらすんません。

なんと、クラスインスタンス(この場合agent)は
py
dic = agent.__dict__

で、agent(インスタンス)の内部変数と値が辞書化して出力される。
戻すときは、
py
agent.__dict__.update(dic)

下記のagent2クラスのように作れば
コンストラクターに辞書を食わせられる。

辞書化すればjsonシリアライズ、デシリアライズは容易。
クラス・オブジェクトごとシリアライズする際は、
jsonシリアライズでは出来ない。
pickleでやる。

python3でも同様にできた。
(文字コードの扱いには注意がいる)

備考
なお、シングルトン的にやろうとすると、インスタンス化しないからだと思うけど
引数にselfがあると引数の数でエラーになる。

import json

class agent():
    def __init__(self,idd):

        self.idd = idd
        self.aaa = idd*2
        self.bbb = idd*3
        self.str = u"agent"

    def dicLoads(self,d):
        self.__dict__.update(d)

    def search():
        print("search")

    def work():
        print("work")

class agent2(object):
    def __init__(self,j):      
        self.__dict__.update(j)
from Agent import agent,agent2

AGENTS = [agent(i) for i in range(0,10)]

print(AGENTS[1].__dict__)
print(AGENTS[2].__dict__)

j = {'idd': 20, 'aaa': 40, 'bbb': 60, 'str': u'env'}

AGENTS[3].dicLoads(j)
Adict3 = AGENTS[3].__dict__
print(Adict3)

AGENTS[2].dicLoads(Adict3)
print(AGENTS[2].__dict__)

p = agent2(j)
print(p.__dict__)

結果
{'idd': 1, 'aaa': 2, 'bbb': 3, 'str': u'agent'}
{'idd': 2, 'aaa': 4, 'bbb': 6, 'str': u'agent'}
{'aaa': 40, 'bbb': 60, 'str': u'env', 'idd': 20}
{'aaa': 40, 'bbb': 60, 'str': u'env', 'idd': 20}
{'idd': 20, 'aaa': 40, 'bbb': 60, 'str': u'env'}

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2