2016-11-29 51 views
1

通常,使用my_dict.my_key而不是my_dict['my_key']访问字典条目会很方便。如何通过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

更好,更安全的方法是使用_getattr_(这是Python的要求什么,当你使用.符号,但千万注意,这种方法只允许字符串键(不是整数,浮点数或任意对象):

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

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

您也可以覆盖__setattr__这样你就可以分配。符号为好。

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

您可以覆盖__getattr__

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

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

将输出'12'

要提到它的最好使用UserDictcollections模块

所以,你可以重写让你的类更清晰:

from collections import UserDict 

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

但是,这将安息在你的ddict对象使用data变量名,因为它会被全部退回dict对象。

而@DeepSpace指出,你可能会想覆盖__setattr__能够通过名称来设置值。

+0

从'UserDict'会以某种方式运行到无限递归继承,而来自'dict'作品继承。 – Michael