我已经开始使用如下构造:
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而不是引发异常,这也很好。
d['something']
更新: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 >>>