базовый вопрос наследования Python (ic)

1

Быстрый вопрос о наследовании Python (ic): в чем разница между размещенной здесь идиомой (super(ChildClass,self).method(args)) по сравнению с тем, что находится на сайте документов Python (ParentClass.method(self,[args]))? Является ли еще один питонический, чем другой?

Теги:
oop
inheritance

1 ответ

4
Лучший ответ

Использование super(ChildClass, self).method(args) позволяет ходить порядок разрешения метода и - если все, но последний родитель использует super - вызов каждый класс в иерархии ровно один раз. (Не то, что super работает только с классами нового стиля.)

Использование ParentClass.method(self, args) вызывает один конкретный класс. Он не работает, когда участвует в множественном наследовании.

В этой статье приводится некоторое описание проблемы и разъясняется много вопросов для некоторых людей. Я не согласен со всеми его выводами, но он дает хорошие примеры и обсуждение.

  • 0
    Да, я еще не нашел возможности сделать super() полезным перед лицом возможного множественного наследования. Мне кажется, что отсутствие аргументов в объектном __innit__ делает весь аргумент спорным. Жаль, что: / Смотрите также это, что является довольно коротким, но доводит это до сути, я думаю :)
  • 0
    Работа с __init__ опасна по нескольким причинам: 1) подпись __init__ становится сигнатурой конструктора, а конструкторы - это единственная область, где теория говорит, что совершенно разные сигнатуры являются полностью кошерными. 2) Уже существуют десятки __init__ , которые уже делают это неправильно. 3) Некоторые детали __init__ неоднократно использовались в последние годы. Часто лучше - хотя, возможно, и не так полезно - подумать о том, как super работает с методами, отличными от __init__ , где ситуация более проста.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню