Это хорошая идея использовать super () в Python? - PullRequest
12 голосов
/ 11 августа 2009

Или я должен просто явно ссылаться на суперклассы, чьи методы я хочу вызвать?

Кажется хрупким повторять имена суперклассов при ссылках на их конструкторы, но эта страница http://fuhm.net/super-harmful/ приводит некоторые аргументы против использования super ().

Ответы [ 6 ]

10 голосов
/ 11 августа 2009

Книга Эксперт по программированию на Python обсуждала тему "супер ловушек" в главе 3. Это стоит прочитать. Ниже приводится заключение книги:

Использование Super должно быть последовательным: в иерархии классов super следует использовать везде или нигде. Смешивание супер и классических звонков - запутанная практика. Люди склонны избегать супер, чтобы их код был более явным.

Редактировать: Сегодня я снова прочитал эту часть книги. Я скопирую еще несколько предложений, так как использование супер сложно:

  • Избегайте множественного наследования в вашем коде.
  • Будьте последовательны с его использованием и не смешивайте новый стиль и старый стиль.
  • Проверьте иерархию классов перед вызовом ее методов в Ваш подкласс.
6 голосов
/ 11 августа 2009

Вы можете использовать супер, но, как говорится в статье, есть недостатки. Пока вы их знаете, проблем с использованием этой функции нет. Это как люди, говорящие «используйте композицию, а не наследование» или «никогда не используйте глобальные переменные». Если функция существует, есть причина. Просто убедитесь, что поняли «почему» и «что», и используйте их с умом.

2 голосов
/ 11 августа 2009

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

Для одиночного наследования действительно нет никакой разницы между

class X(Y):
    def func(self):
        Y.func(self)

и

class X(Y):
    def func(self):
        super().func()

так что я думаю, что это только вопрос вкуса.

2 голосов
/ 11 августа 2009

Проблема людей с super - это проблема множественного наследования. Так что немного несправедливо винить super. Без super множественное наследование еще хуже. Мишель Симионато красиво обернул это в своей статье блога на супер:

С другой стороны, можно задаться вопросом, все супер бородавки не намеки на некоторые серьезная проблема, лежащая в основе. Это может хорошо, что проблема не с супер, ни с кооперативными методами: проблема может быть с несколькими Само наследство.

Итак, главный урок в том, что вам следует избегать множественного наследования.

В интересах последовательности я всегда использую super, даже если для одиночного наследования это не имеет большого значения (кроме небольшого преимущества отсутствия необходимости знать имя родительского класса). В Python 3+ super удобнее, поэтому обязательно стоит использовать super.

2 голосов
/ 11 августа 2009

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

0 голосов
/ 11 августа 2009

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

Просто придерживайтесь ключевых аргументов в ваших __init__ методах, и у вас не должно быть слишком много проблем. Кроме того, вы можете использовать **kwargs для поддержки дополнительных параметров, которые не определены на уровнях цепочки наследования.

Я согласен, что он хрупкий, но не менее, чем использование имени унаследованного класса.

...