オブジェクトのシリアライズ・デシリアライズ関連メモ
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'}