Ответ 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 может не быть одной из базовых классов текущего класса.