(setf (nth N L) T)
самый ясный, самый сжатый, и самый быстрый путь, если то, что Вы хотите сделать, является "разрушительной" модификацией, т.е. на самом деле измените существующий список. Это не выделяет новой памяти.
В книге Экспертное программирование на Python в главе 3 обсуждается тема "супер-ловушек". Ее стоит прочитать. Ниже приводится вывод книги:
Использование супер должно быть последовательным: в иерархии классов супер следует использовать везде или нигде. Смешивание супер и классических звонков - запутанная практика. Люди склонны избегать super, чтобы их код был более явным.
Править: Сегодня я снова прочитал эту часть книги. Я скопирую еще несколько предложений, так как супериспользование сложно:
Можно использовать super, но, как сказано в статье, есть недостатки. Пока вы их знаете, проблем с использованием этой функции нет. Это как люди говорят «используйте композицию, а не наследование» или «никогда не используйте глобальные переменные». Если функция существует, на то есть причина. Просто убедитесь, что понимаете, почему и что, и используйте их с умом.
Мне больше нравится super (), потому что он позволяет вам изменять унаследованный класс (например, при рефакторинге и добавлении промежуточного класса), не изменяя его во всех методах.
super () пытается решить за вас проблему множественного наследования; его семантику сложно воспроизвести, и, конечно, не следует создавать новую семантику, если вы полностью не уверены.
Для одиночного наследования нет никакой разницы между
class X(Y):
def func(self):
Y.func(self)
и
class X(Y):
def func(self):
super().func()
, так что я думаю, это просто вопрос вкуса.
Проблема, с которой люди сталкиваются с super
, больше связана с множественным наследованием. Так что винить супер
немного несправедливо. Без super
множественное наследование еще хуже. Микеле Симионато красиво обернул это в своей статье в блоге о super:
С другой стороны, можно задаться вопросом, а не все супер бородавки не намеки на некоторые серьезная проблема, лежащая в основе. Это может хорошо, что проблема не в супер, ни кооперативными методами: проблема может быть в нескольких само наследование.
Итак, главный урок состоит в том, что вы должны стараться избегать множественного наследования.
В интересах согласованности я всегда использую super, даже если для одиночного наследования это не имеет особого значения (кроме небольшого преимущества не нужно знать имя родительского класса). В Python 3+ super
удобнее, поэтому там обязательно нужно использовать super.
Да, вам следует использовать super ()
вместо других методов . Теперь это стандартная модель наследования объектов в Python 3.
Просто придерживайтесь аргументов ключевого слова в своих методах __ init __
, и у вас не должно возникнуть слишком много проблем. Кроме того, вы можете использовать ** kwargs
для поддержки дополнительных параметров, которые не определены на уровнях цепочки наследования.
Я согласен с тем, что это хрупко, но не меньше, чем использование имени унаследованного класса.