我已经开始使用如下构造:
class DictObj(object):
def __init__(self):
self.d = {}
def __getattr__(self, m):
return self.d.get(m, None)
def __setattr__(self, m, v):
super.__setattr__(self, m, v)
更新:基于此线程,我将DictObj实现修改为:
class dotdict(dict):
def __getattr__(self, attr):
return self.get(attr, None)
__setattr__= dict.__setitem__
__delattr__= dict.__delitem__
class AutoEnum(object):
def __init__(self):
self.counter = 0
self.d = {}
def __getattr__(self, c):
if c not in self.d:
self.d[c] = self.counter
self.counter += 1
return self.d[c]
其中DictObj是可以通过点表示法访问的字典:
d = DictObj()
d.something = 'one'
我发现它比
d['something']
在美学上更令人愉悦。请注意,访问未定义的键将返回None而不是引发异常,这也很好。更新:Smashery很好,mhawke对其进行了扩展以提供更简单的解决方案。我想知道使用 dict 而不是定义新词典是否有任何不良后果;如果没有,我非常喜欢mhawke的解决方案。
AutoEnum是一个自动递增的Enum,用法如下:
CMD = AutoEnum()
cmds = {
"peek": CMD.PEEK,
"look": CMD.PEEK,
"help": CMD.HELP,
"poke": CMD.POKE,
"modify": CMD.POKE,
}
两者都对我来说运作良好,但是我对它们感到不可思议。
这些实际上是不好的构造吗?
最佳答案
这是DictObj类的简单版本:
class DictObj(object):
def __getattr__(self, attr):
return self.__dict__.get(attr)
>>> d = DictObj()
>>> d.something = 'one'
>>> print d.something
one
>>> print d.somethingelse
None
>>>
关于python - 字典键的Javascript样式点表示法是非Python的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/224026/