Я начал использовать конструкции, подобные этим:
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 вместо определения нового словаря; если нет, то мне очень нравится решение Мхавке.
AutoEnum - это автоинкрементный Enum, используемый следующим образом:
CMD = AutoEnum()
cmds = {
"peek": CMD.PEEK,
"look": CMD.PEEK,
"help": CMD.HELP,
"poke": CMD.POKE,
"modify": CMD.POKE,
}
Оба работают хорошо для меня, но я чувствую себя неуверенно по отношению к ним.
Это на самом деле плохие конструкции?