如何使用my_dict.my_key访问dict?

时间:2016-11-29 09:46:43

标签: python dictionary

通常,使用my_dict.my_key代替my_dict['my_key']来访问dict条目会很方便。

所以我提出了以下解决方案:

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)

这种方法是安全还是会在某些时候咬我?甚至可能有内置的方法吗?

(为什么我想要那个?比dict或明确定义的类更容易打字和看起来更好,但这不应该是这里的主题,因为它是品味和情况的问题。它是可迭代的。)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以覆盖__getattr__

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

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

将输出'12'

最好使用UserDict模块中的collections

所以你可以覆盖让你的课程更清晰:

from collections import UserDict

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

但是这将使用data作为变量名称在ddict对象中休息,因为它将返回整个dict对象。

正如@DeepSpace所说,您可能希望覆盖__setattr__以便能够通过名称设置值。