Есть ли причина, по которой вы не можете использовать обычный словарь?Кажется, что атрибуты не имеют определенного порядка в вашей конкретной ситуации.
В качестве альтернативы, вы также можете использовать экземпляр класса (который имеет хороший синтаксис доступа к атрибутам).Вы можете использовать __slots__
, если хотите избежать создания __dict__
для каждого экземпляра.
Я также только что нашел рецепт для "records" , который описывается какизменяемые именованные кортежи.Они реализованы с использованием классов.
Обновление:
Поскольку вы говорите, что порядок важен для вашего сценария (и вы хотите перебрать все атрибуты), OrderedDict
, кажется, является способомидти.Это часть стандартного модуля collections
в Python 2.7;Существуют и другие реализации , распространяющиеся по Интернету для Python <2.7. </p>
Чтобы добавить доступ в стиле атрибутов, вы можете создать его подкласс следующим образом:
from collections import OrderedDict
class MutableNamedTuple(OrderedDict):
def __init__(self, *args, **kwargs):
super(MutableNamedTuple, self).__init__(*args, **kwargs)
self._initialized = True
def __getattr__(self, name):
try:
return self[name]
except KeyError:
raise AttributeError(name)
def __setattr__(self, name, value):
if hasattr(self, '_initialized'):
super(MutableNamedTuple, self).__setitem__(name, value)
else:
super(MutableNamedTuple, self).__setattr__(name, value)
Тогда выможно сделать:
>>> t = MutableNamedTuple()
>>> t.foo = u'Crazy camels!'
>>> t.bar = u'Yay, attribute access'
>>> t.foo
u'Crazy camels!'
>>> t.values()
[u'Crazy camels!', u'Yay, attribute access']