Когда вызывать Python super () .__ init __ ()?

(Я не могу найти ссылку в любом месте по этому вопросу после некоторого Googling.)

С этим примером короткого кода можно четко продемонстрировать сценарий:

class X: def __init__(self, stuff): self.__stuff = stuff class Y(X): def __init__(self, stuff): # Is it safe to execute statements before calling super.__init__()? new_stuff = self.call_another_method(stuff) super(Y, self).__init__(new_stuff) 

Используя CPython 3.x, приведенный выше пример кода работает – при call_another_method() существует call_another_method() . Этот стиль кодирования в целом безопасен, но нахмурился или считался unPythonic? Я не могу найти совета по этому вопросу.

Почему меня это волнует?

Мой опыт связан с более традиционными объектно-ориентированными языками программирования, такими как C ++, C # и Java, где «super» нужно называть строго как первый оператор в конструкторе подкласса – игнорируя неявный аргумент с нулевым аргументом.

Если это имеет значение, я буду молодым Питонером: 3+, пожалуйста.

Да, совершенно безопасно вызывать другие вещи перед super() . Python не устанавливает порядок, и для этого существует множество прецедентов.

Обратите внимание, что вызов super().__init__() – это просто другое выражение в Python, это не синтаксическая конструкция. Вы также можете использовать внешние super() внешние методы, например, если вы передадите правильные аргументы.

В вашем случае вы можете опустить аргументы типа и экземпляра, Python 3 будет извлекать их для вас, когда super() вызывается без аргументов, потому что вы используете его в функции, определенной внутри класса:

 class Y(X): def __init__(self, stuff): new_stuff = self.call_another_method(stuff) # super(Y, self) is implicit here: super().__init__(new_stuff)