Быстрый вопрос о наследовании Python (ic): в чем разница между размещенной здесь идиомой (super(ChildClass,self).method(args)
) по сравнению с тем, что находится на сайте документов Python (ParentClass.method(self,[args])
)? Является ли еще один питонический, чем другой?
Использование super(ChildClass, self).method(args)
позволяет ходить порядок разрешения метода и - если все, но последний родитель использует super
- вызов каждый класс в иерархии ровно один раз. (Не то, что super
работает только с классами нового стиля.)
Использование ParentClass.method(self, args)
вызывает один конкретный класс. Он не работает, когда участвует в множественном наследовании.
В этой статье приводится некоторое описание проблемы и разъясняется много вопросов для некоторых людей. Я не согласен со всеми его выводами, но он дает хорошие примеры и обсуждение.
super()
полезным перед лицом возможного множественного наследования. Мне кажется, что отсутствие аргументов в объектном__innit__
делает весь аргумент спорным. Жаль, что: / Смотрите также это, что является довольно коротким, но доводит это до сути, я думаю :)__init__
опасна по нескольким причинам: 1) подпись__init__
становится сигнатурой конструктора, а конструкторы - это единственная область, где теория говорит, что совершенно разные сигнатуры являются полностью кошерными. 2) Уже существуют десятки__init__
, которые уже делают это неправильно. 3) Некоторые детали__init__
неоднократно использовались в последние годы. Часто лучше - хотя, возможно, и не так полезно - подумать о том, какsuper
работает с методами, отличными от__init__
, где ситуация более проста.