【发布时间】:2010-09-18 10:49:00
【问题描述】:
我已经开始使用这样的结构:
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 是一个自增枚举,使用如下:
CMD = AutoEnum()
cmds = {
"peek": CMD.PEEK,
"look": CMD.PEEK,
"help": CMD.HELP,
"poke": CMD.POKE,
"modify": CMD.POKE,
}
两者对我来说都很好,但我对它们感到很奇怪。
这些实际上是坏的结构吗?
【问题讨论】:
-
非常好!类 dotdict 简约而优雅。我想我会使用它。然而,关于“AutoEnum”......我的问题是每个“键”的“值”在每次运行时可能不同,所以你不能将它用于存储在数据库或任何东西中的值(好吧,我想你可以保持值相同,如果你小心不要改变初始访问的顺序......但值不是明确的)
-
等等!dotdict 有一个问题:如果您尝试使用作为 dict 方法名称的键,它就不起作用,例如:“items”、“keys” ,“获取”,“清除”,“复制”等......这有点问题。有没有办法解决?有没有办法“吃蛋糕也吃”? (能够调用 dict 方法,还能够在不改变语法的情况下使用“items”和“clear”等键?)。
标签: python coding-style