Классы нового стиля Python и суперфункция - PullRequest
2 голосов
/ 04 мая 2010

Я не ожидаю увидеть результат:

class A(dict):
    def __init__(self, *args, **kwargs):
        self['args'] = args
        self['kwargs'] = kwargs

class B(A):
    def __init__(self, *args, **kwargs):
        super(B, self).__init__(args, kwargs)

print 'Instance A:', A('monkey', banana=True)
#Instance A: {'args': ('monkey',), 'kwargs': {'banana': True}}

print 'Instance B:', B('monkey', banana=True)
#Instance B: {'args': (('monkey',), {'banana': True}), 'kwargs': {}}

Я просто пытаюсь заставить классы A и B иметь согласованные значения. Я не уверен, почему kwargs вставляются в аргументы, но я должен предположить, что я либо называю __init__() неправильно из подкласса, либо пытаюсь сделать что-то, что вы просто не можете сделать.

Какие-нибудь советы?

Ответы [ 2 ]

14 голосов
/ 04 мая 2010

Попробуйте вместо этого:

super(B, self).__init__(*args, **kwargs)

Поскольку функция init для A ожидает фактические args / kwargs (а не только два аргумента), вам нужно передать ей распакованные версии args / kwargs, чтобы они были правильно упакованы.

В противном случае, уже упакованный список args и dict of kwargs переупаковывается как просто список args с двумя элементами и пустой dict kwargs, из-за того, что вы передаете список и dict, вместо фактических неназванных и именованных параметров.

2 голосов
/ 04 мая 2010

Хотя я полностью согласен с Дэвом, знаете ли вы, что если __init__ из B не имеет никакой другой цели, кроме вызова его супер, вы можете спокойно его опустить?Я имею в виду, что с вашими примерами вы могли бы просто определить B как

>>> class B(A):
...      pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...