Чому б просто не використовувати імена атрибутів як ключі до словника?
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)
отримуючи додаткову перевагу від використання методу init, який також може робити аргументи ключових слів (наприклад, "e = Співробітник (ім'я =" Оскар ")" або просто взяти в словник (наприклад, "e = Співробітник ( ** dict) ").