AttrDictの方が便利だけど、ちょっと使いたいのにインストールしたくない人向け(22/10/16更新)
値の参照だけしたいとき
定義
class Dict(dict):__getattr__=dict.__getitem__
要素の追加もできるように__setattr__を追加したバージョン。
class Dict(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
使用時
a = Dict(a=0, b=Dict(c=1, d=2))
(a.a, a.b.c, a["a"], a["b"]["c"])
値も設定したい
定義
class Dict(dict):__getattr__=dict.__getitem__;__setattr__=dict.__setitem__
一行で書く必要はないけど。
使用時
a = Dict()
a.b = Dict()
a.b.c = True
a.b.d = True
a.b["c"] = False
a.b.d = False
print(a)
pickleで使いたいとき
定義
class Dict(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
def __getstate__(self):
return self.__dict__.copy()
def __setstate__(self, state):
self.__dict__.update(state)
__getstate__, __setstate__
をpickle対策のため追加
使用時
import pickle
a = Dict(a=0, b=Dict(c=1, d=2))
a.b.e = False
(a, (a.a, a.b.c, a["a"], a["b"]["c"]), pickle.loads(pickle.dumps(a)))
番外編
式で書いてみる。特に意味はない。
globals().update({"Dict": type("Dict", (dict,), dict(__getattr__=dict.__getitem__, __setattr__=dict.__setitem__))}); a=Dict(a=1, b=Dict(c=2, d=3)); a.b.e=4; a