Ответ 1
Вы не используете позиционные аргументы в своем примере. Соответствующий код:
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})
Инициализация ядра элемента p > 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
.
Надежда не слишком грязная.