Вы не используете позиционные аргументы в вашем примере. Так что соответствующий код:
class attrdict(dict):
def __init__(self, **kwargs):
dict.__init__(self, **kwargs)
self.__dict__ = self
В первой строке вы определяете класс attrdict
как подкласс dict
.
Во второй строке вы определяете функцию, которая автоматически инициализирует ваш экземпляр. Вы передаете аргументы ключевого слова (**kargs
) этой функции. Когда вы создаете экземпляр a
:
a = attrdict(x=1, y=2)
Вы на самом деле звоните
attrdict.__init__(a, {'x':1, 'y':2})
инициализация ядра экземпляра dict выполняется путем инициализации встроенного суперкласса dict
. Это делается в третьей строке, передавая параметры, полученные в attrdict.__init__
.
Таким образом,
dict.__init__(self,{'x':1, 'y':2})
делает self
(экземпляр a
) словарем:
self == {'x':1, 'y':2}
Самое приятное происходит в последней строке:
У каждого экземпляра есть словарь, содержащий его атрибуты. Это self.__dict__
(т.е. a.__dict__
).
Например, если
a.__dict__ = {'x':1, 'y':2}
мы могли бы написать a.x
или a.y
и получить значения 1 или 2 соответственно.
Итак, вот что делает строка 4:
self.__dict__ = self
эквивалентно:
a.__dict__ = a where a = {'x':1, 'y':2}
Тогда я могу позвонить a.x
и a.y
.
Надеюсь, что не слишком грязно.