Это продолжение от этого вопроса :
Effective Java 2nd Edition, Item 17: Дизайн и документ для наследования, или же запретить его:
Есть еще несколько ограничений, которым должен подчиняться класс, чтобы разрешить наследование.Конструкторы не должны вызывать переопределяемые методы, прямо или косвенно.Если вы нарушите это правило, произойдет сбой программы.Конструктор суперкласса выполняется перед конструктором подкласса, поэтому метод переопределения в подклассе будет вызван до запуска конструктора подкласса.Если переопределяющий метод зависит от какой-либо инициализации, выполняемой конструктором подкласса, метод не будет работать должным образом.
Поскольку мы собираемся коснуться только аспекта инициализации конструктора Java, я предполагаю, что это безопасносравнить Java-конструктор с Python __init__()
в этом вопросе.
Я предполагаю, что в Python
у меня есть возможность решить, когда вызывать (после инициализации атрибутов данных моего текущего класса в этом случае) мой__init__()
предка по сравнению с Java, где super()
должен быть первым оператором в вызове конструктора, я могу быть безопасным при вызове переопределенных методов из __init__()
?
Если я правильно угадаю вышеупомянутоеРазве я не останусь в роли дизайнера класса предков по милости моего дизайнера подкласса?Если дизайнер подкласса вызывает my __init__()
до того, как он инициализирует свои атрибуты данных, которые будут использоваться одним из его переопределенных методов, и я вызываю этот метод, я получаю ошибку программы!