2009-08-11 4 views
10

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

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

ответ

8

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

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

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

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

Да, просто придерживайтесь аргументов ключевого слова в своих методах __init__, и у вас не должно быть слишком много проблем.

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

5

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

+12

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

2

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

+2

, если вы еще не используете python 3 (что является большинством использования python) – nosklo

+1

Что вы имеете в виду? super() также находится на Python 2. – juanjux

+0

Я верю. –

3

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

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

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

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

2

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

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

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

и

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

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

Смежные вопросы