Действительно ли это - хорошая идея использовать супер () в Python?

(setf (nth N L) T)

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

12
задан Josh Gibson 11 August 2009 в 10:32
поделиться

6 ответов

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

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

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

  • Избегайте множественного наследования в вашем коде.
  • Будьте последовательны в его использовании и не смешивайте новый стиль и старый стиль.
  • Проверьте иерархию классов перед вызовом его методов в ваш подкласс.
10
ответ дан 2 December 2019 в 07:03
поделиться

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

6
ответ дан 2 December 2019 в 07:03
поделиться

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

2
ответ дан 2 December 2019 в 07:03
поделиться

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

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

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

и

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

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

2
ответ дан 2 December 2019 в 07:03
поделиться

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

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

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

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

2
ответ дан 2 December 2019 в 07:03
поделиться

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

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

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

0
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: