Разница в поведении между super().__init__() и явным суперклассом __init__() в Python

Я получаю необъяснимую разницу в поведении между использованием super().__init__() и явным вызовом конструктора суперкласса в моем коде.

class IPElement(object):

def __init__(self, ip_type='IPv4'):
    self.ip_type = ip_type

class IPAddressSimple(IPElement):

    def __init__(self, ip_name, ip_type='IPv4'):
        self.ip_name = ip_name
        super().__init__(self, ip_type=ip_type)

Здесь строка super().__init__(self, ip_type=ip_type) приводит к ошибке типа:

TypeError: __init__() got multiple values for argument 'ip_type'

Когда я изменяю вызов для передачи ip_type по положению (например, super().__init__(self, ip_type), я получаю ошибку другого типа:

TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given

Ни одна из этих ошибок не имеет для меня смысла, и когда я заменяю super() явным именем суперкласса, все работает, как и ожидалось. Следующее работает отлично, как и передача ip_type по положению:

class IPAddressSimple(IPElement):

        def __init__(self, ip_name, ip_type='IPv4'):
            self.ip_name = ip_name
            IPElement.__init__(self, ip_type=ip_type)

Я, конечно, могу использовать явный вызов метода __init__ суперкласса, если это необходимо, но я хотел бы понять, почему super() здесь не работает.


person qdet    schedule 19.12.2014    source источник
comment
Отвечает ли это на ваш вопрос? Что делает 'super' в Python?   -  person Rabbid76    schedule 28.05.2021


Ответы (1)


super() уже передает self за вас. super(IPAddressSimple) не знал бы о self, поэтому в этом случае вам нужно было бы позвонить super(IPAddressSimple).__init__(self, ip_type). Но super() (который является синтаксическим сахаром для super(IPAddressSimple, self)) знает self и обрабатывает его, поэтому вам следует передавать ip_type только вручную.

person Community    schedule 19.12.2014
comment
Как всегда, самые непонятные вопросы имеют самое простое объяснение. Спасибо за четкий, лаконичный ответ! - person qdet; 19.12.2014