Почему бы просто не использовать имена атрибутов как ключи к словарю?
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
Вы можете инициализировать именованные аргументы, список кортежей, словарь или отдельные атрибуты, например:
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)
В качестве альтернативы, вместо того, чтобы вызывать ошибку атрибута, вы можете вернуть None для неизвестных значений. (Уловка, используемая в классе хранилища web2py)
def __init__(self,**initial_data)
вы получаете дополнительное преимущество наличия метода инициализации, который также может выполнять аргументы ключевого слова (например, «e = Employee (name = 'Oscar')» или просто использовать словарь (например, «e = Employee ( ** dict) ").