Подтвердить что ты не робот

Наследование Python super() и необходимые аргументы

Учитывая:

class Parent(object):

    def altered(self):
        print "PARENT altered()"

class Child(Parent):

    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()    # what are the arguments needed?  Why Child and self?
        print "CHILD, AFTER PARENT altered()"

В Python 2.7, почему нужно Child передавать в качестве аргумента для вызова super()? Каковы тонкие тонкости использования супер, а не просто возможность работать.

4b9b3361

Ответ 1

super показывает, что является следующим классом в порядке разрешения метода. Два аргумента, которые вы передаете, - это то, что позволяет понять, что out - self дает ему весь MRO через атрибут; текущий класс рассказывает, где вы сейчас находитесь по MRO. Итак, что супер действительно делает, в основном:

def super(cls, inst):
    mro = inst.__class__.mro() # Always the most derived class
    return mro[mro.index(cls) + 1]

Причина, по которой это текущий класс, а не базовый класс, состоит в том, что вся суть супер заключается в том, чтобы иметь функцию, которая работает над тем, что этот базовый класс вместо того, чтобы ссылаться на него явно - что может вызвать проблемы, если имя базового класса изменяется, если вы точно не знаете, что называется родительским классом (думайте о factory, таких как namedtuple, которые выплевывают новый класс), и особенно в ситуациях с несколькими наследствами (где следующий класс в MRO может не быть одной из базовых классов текущего класса.