通常,使用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或明确定义的类更容易打字和看起来更好,但这不应该是这里的主题,因为它是品味和情况的问题。它是可迭代的。)
答案 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__
以便能够通过名称设置值。