В ответе Анона:
«Если вам нужно сделать что-то из суперспособности __init__
в дополнение к тому, что делается в текущем классе,__init__
, вы должны вызвать это самостоятельно, поскольку это не произойдет автоматически»
Это невероятно: он формулирует прямо противоположную принципу наследования.
Дело не в том, что «что-то из super __init__
(...) не произойдет автоматически» , а в том, что это БУДЕТ происходить автоматически, но этого не происходит, потому что базовый класс '__init__
отменяется определением производного класса.__init__
Итак, ПОЧЕМУ определение производного_класса? __init__
, поскольку он перекрывает то, на что нацелено, когда кто-то прибегает к наследованию ??
Это потому, что нужно определить что-то, что НЕ выполняется в базовом классе __init__
, и единственная возможность получить это - поместить его выполнение в функцию производного класса __init__
.
Другими словами, в базовом классе нужно что-то « __init__
в дополнение к тому, что автоматически делалось бы в базовом классе », __init__
если бы последний не был переопределен.
НЕ наоборот.
Тогда проблема в том, что желаемые инструкции, присутствующие в базовом классе __init__
, больше не активируются в момент создания экземпляра. Чтобы компенсировать эту инактивацию, требуется кое-что особенное: явный вызов базового класса __init__
, «чтобы СОХРАНИТЬ , НЕ ДОБАВИТЬ, инициализацию, выполняемую базовым классом» __init__
. Это именно то, что сказано в официальном документе:
Переопределяющий метод в производном классе может фактически захотеть расширить, а не просто заменить одноименный метод базового класса . Существует простой способ вызвать метод базового класса напрямую: просто вызовите BaseClassName.methodname (self, arguments).
http://docs.python.org/tutorial/classes.html#inheritance
Вот и вся история:
когда цель состоит в том, чтобы СОХРАНИТЬ инициализацию, выполняемую базовым классом, то есть чистое наследование, ничего особенного не требуется, нужно просто избегать определения __init__
функции в производном классе
когда целью является ЗАМЕНИТЬ инициализацию, выполняемую базовым классом, она __init__
должна быть определена в производном классе
когда цель состоит в том, чтобы ДОБАВИТЬ процессы к инициализации, выполняемой базовым классом, __init__
должен быть определен производный класс , содержащий явный вызов базового класса__init__
Что меня удивляет в посте Анона, так это не только то, что он выражает противоположное теории наследования, но и то, что 5 парней прошли мимо, за которые проголосовали, не поворачиваясь, и, более того, никто не отреагировал за 2 года в ветка, интересная тема которой должна читаться относительно часто.
object
был опечаткой. Но теперь у вас даже нетsuper
названия, к которому относится ваш вопрос.