класс, dict, сам, init, args?

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

Кто-то мог объяснить первые четыре строки в словах? Я читал о классах и методах. Но здесь это кажется очень сбивающим с толку.

11
задан SilentGhost 15 April 2010 в 15:31
поделиться

3 ответа

Вы не используете позиционные аргументы в своей пример. Итак, соответствующий код:

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 .

Надежды не так уж и неприятны.

5
ответ дан 3 December 2019 в 07:36
поделиться

Вот хорошая статья, объясняющая __ dict __ :

Динамический dict

Класс attrdict использует то, что путем наследования из словаря и последующего присвоения этому словарю __ dict __ объекта. Таким образом, любой доступ к атрибутам происходит в отношении родительского словаря (т. Е. Класса dict , от которого он наследуется).

Остальная часть статьи также очень хороша для понимания объектов Python:

Атрибуты и методы Python

4
ответ дан 3 December 2019 в 07:36
поделиться

Мой снимок построчного объяснения:

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, в приведенном ниже коде.

Надеюсь, это поможет прояснить ваше замешательство.

7
ответ дан 3 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: