class attrdict(dict):
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
self.__dict__ = self
a = attrdict(x=1, y=2)
print a.x, a.y
b = attrdict()
b.x, b.y = 1, 2
print b.x, b.y
Кто-то мог объяснить первые четыре строки в словах? Я читал о классах и методах. Но здесь это кажется очень сбивающим с толку.
Вы не используете позиционные аргументы в своей пример. Итак, соответствующий код:
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
.
Надежды не так уж и неприятны.
Вот хорошая статья, объясняющая __ dict __
:
Класс attrdict
использует то, что путем наследования из словаря и последующего присвоения этому словарю __ dict __
объекта. Таким образом, любой доступ к атрибутам происходит в отношении родительского словаря (т. Е. Класса dict
, от которого он наследуется).
Остальная часть статьи также очень хороша для понимания объектов Python:
Мой снимок построчного объяснения:
class attrdict(dict):
В этой строке объявляется класс attrdict как подкласс встроенного класса dict.
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
Это ваш стандартный метод __ init __
. Вызов метода dict .__ init __ (...)
заключается в использовании метода конструктора класса super
(в данном случае dict) ( __ init __
).
В последней строке, self .__ dict__ = self
, к ключевым аргументам (kwargs), которые вы передаете методу __ init __
, можно получить доступ как к атрибутам, например, ax, в приведенном ниже коде.
Надеюсь, это поможет прояснить ваше замешательство.