Почему этот класс python распечатывает мои kwargs? - PullRequest
0 голосов
/ 17 июля 2011
class Meta(dict):
    def __init__(self, indexed, method, *args, **kwargs):
        super(Meta, self).__init__(*args, **kwargs)
        print self

Почему это печатает мои kwargs?

m = Meta(indexed='hello', method='distance', a='3', b='4')

Когда я запускаю это, он печатает словарь с моими kwargs, когда я ожидаю пустой словарь ...

Ответы [ 5 ]

4 голосов
/ 17 июля 2011

Почему вы ожидаете, что self не будет содержать ваши ключевые слова args, когда вы явно инициализировали свой экземпляр (подкласс dict) с помощью ключевого слова args, вызвав инициализатор класса dict?

3 голосов
/ 17 июля 2011

Это потому, что класс dict инициализирует свое содержимое из аргументов ключевого слова, переданных его конструктору:

>>> dict(indexed='hello', method='distance', a='3', b='4')
{'a': '3', 'indexed': 'hello', 'b': '4', 'method': 'distance'}

Поскольку ваш класс вызывает конструктор dict с аргументами ключевого слова, переданными его собственному конструктору, словарь действительно инициализируется и наблюдается то же поведение.

1 голос
/ 17 июля 2011

Почему бы и нет?Класс наследует связанную реализацию str и repr от dict.

0 голосов
/ 17 июля 2011

Поскольку вы передаете их инициализатору dict.

попробуйте это:

>>> dict(a=1, b=2, c=3)
{'a': 1, 'c': 3, 'b': 2}
0 голосов
/ 17 июля 2011

Оператор print self в конструкторе эффективно печатает ваши kwargs.Это из-за поведения, которое вы унаследовали от класса dict.Кварги включены в словарный магазин.

>>> d = dict(a=3, b=4)
>>> print d
{'a': 3, 'b': 4}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...