2016-11-29 3 views
1

多くの場合、my_dict['my_key']の代わりにmy_dict.my_keyのdictエントリにアクセスすると便利です。my_dict.my_keyによるアクセスでディクテーションを作成するには?

だから私は、次の解決策を考え出した:

class ddict(dict): 
    def __init__(self, **kwargs): 
     dict.__init__(self, **kwargs) 
     for (k, v) in kwargs.items(): 
      self.__dict__[k] = v 

あなたにそれを使用することができます:

d = ddict(a = 1, b = 2) 
    print(d.a) 
    print(d.b) 

は、そのアプローチは安全ですか、それはいくつかの点で私をかむだろうか?多分組み込みのアプローチですか?

(なぜ私が?簡単タイピングをしたくや辞書または明示的に定義されたクラスよりも良く見えますが、それは味と状況の問題だからそれは、ここでは話題にならないはずです。そして、それは反復可能だん。)

答えて

3

より良い、より安全な方法は)あなたが.表記を使用するときにPythonが呼んでいる(_getattr_を使用するが、この方法が唯一の文字列キー(ない整数、山車や任意のオブジェクトを許容することに注意してください次のようになります。

class ddict(dict): 
    def __getattr__(self, item): 
     return self[item] 

d = ddict() 
d['a'] = 1 
print(d.a) 
>> 1 

またそうあなたにも。表記を割り当てることができます__setattr__を無効にすることができる。 `dict`作品から継承しながら` UserDict`は何とか、無限再帰に実行されますから継承

class ddict(dict): 
    def __getattr__(self, item): 
     return self[item] 

    def __setattr__(self, key, value): 
     self[key] = value 

d = ddict() 
d.a = 1 
print(d.a) 
>> 1 
0

あなたはそれがcollectionsモジュールから

012を UserDictを使用することをお勧めします言及する __getattr__

class ddict(dict): 
    def __getattr__(self, item): 
     return self[item] 

a=ddict({'a':'12'}) 
a.a 

ウィル出力'12'

を上書きすることができます

つまり、あなたのクラスは、より明確にオーバーライドすることができます。

from collections import UserDict 

class ddict(UserDict): 
    def __getattr__(self, item): 
     return self.data[item] 

しかし、それは全体dictオブジェクトを返すことになるので、これは、あなたのddictオブジェクトに変数名としてdataを使用して休んでます。

@DeepSpaceが指摘したように、おそらく__setattr__を無効にして、名前から値を設定できるようにしたいとします。

+0

。 – Michael

関連する問題