Por que não usar nomes de atributos apenas como chaves para um dicionário?
class StructMyDict(dict):
def __getattr__(self, name):
try:
return self[name]
except KeyError as e:
raise AttributeError(e)
def __setattr__(self, name, value):
self[name] = value
Você pode inicializar com argumentos nomeados, uma lista de tuplas ou um dicionário ou atribuições de atributos individuais, por exemplo:
nautical = StructMyDict(left = "Port", right = "Starboard") # named args
nautical2 = StructMyDict({"left":"Port","right":"Starboard"}) # dictionary
nautical3 = StructMyDict([("left","Port"),("right","Starboard")]) # tuples list
nautical4 = StructMyDict() # fields TBD
nautical4.left = "Port"
nautical4.right = "Starboard"
for x in [nautical, nautical2, nautical3, nautical4]:
print "%s <--> %s" % (x.left,x.right)
Como alternativa, em vez de aumentar o erro de atributo, você pode retornar Nenhum para valores desconhecidos. (Um truque usado na classe de armazenamento web2py)
def __init__(self,**initial_data)
obtém o benefício adicional de ter um método init que também pode fazer argumentos de palavras-chave (por exemplo, "e = Employee (name = 'Oscar')" ou apenas obter um dicionário (por exemplo, "e = Employee ( ** dict) ").