关于python:如何使用my_dict.my_key访问dict?

How to make a dict with access by my_dict.my_key?

本问题已经有最佳答案,请猛点这里访问。

通常,使用my_dict.my_key而不是my_dict['my_key']访问dict条目比较方便。

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

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

您可以将其用作:

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

这条路安全吗,还是会在某个时候咬我?是否有内置的方法?

(我为什么要这个?打字容易,看起来比听写或明确定义的类好,但这不应该成为这里的主题,因为这是一个品味和情况的问题。而且它是无可辩驳的。)


一种更好更安全的方法是使用_getattr_(这是python在使用.符号时调用的方法,但请注意,这种方法只允许字符串键(不是整数、浮点数或任意对象):

1
2
3
4
5
6
7
8
class ddict(dict):
    def __getattr__(self, item):
        return self[item]

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

您还可以重写__setattr__,以便可以使用分配。还有符号。

1
2
3
4
5
6
7
8
9
10
11
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

您可以覆盖__getattr__

1
2
3
4
5
6
class ddict(dict):
    def __getattr__(self, item):
        return self[item]

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

将输出'12'

更重要的是,最好使用来自collections模块的UserDict

因此,可以重写使类更清晰:

1
2
3
4
5
from collections import UserDict

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

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

正如@deepspace所指出的,您可能希望覆盖__setattr__,以便能够通过name设置值。