Безопасно ли вызывать переопределенный метод из __init __ ()? - PullRequest
10 голосов
/ 28 июля 2011

Это продолжение от этого вопроса :

Effective Java 2nd Edition, Item 17: Дизайн и документ для наследования, или же запретить его:

Есть еще несколько ограничений, которым должен подчиняться класс, чтобы разрешить наследование.Конструкторы не должны вызывать переопределяемые методы, прямо или косвенно.Если вы нарушите это правило, произойдет сбой программы.Конструктор суперкласса выполняется перед конструктором подкласса, поэтому метод переопределения в подклассе будет вызван до запуска конструктора подкласса.Если переопределяющий метод зависит от какой-либо инициализации, выполняемой конструктором подкласса, метод не будет работать должным образом.

Поскольку мы собираемся коснуться только аспекта инициализации конструктора Java, я предполагаю, что это безопасносравнить Java-конструктор с Python __init__() в этом вопросе.

Я предполагаю, что в Python у меня есть возможность решить, когда вызывать (после инициализации атрибутов данных моего текущего класса в этом случае) мой__init__() предка по сравнению с Java, где super() должен быть первым оператором в вызове конструктора, я могу быть безопасным при вызове переопределенных методов из __init__()?

Если я правильно угадаю вышеупомянутоеРазве я не останусь в роли дизайнера класса предков по милости моего дизайнера подкласса?Если дизайнер подкласса вызывает my __init__() до того, как он инициализирует свои атрибуты данных, которые будут использоваться одним из его переопределенных методов, и я вызываю этот метод, я получаю ошибку программы!

1 Ответ

6 голосов
/ 28 июля 2011

Я могу быть безопасным при вызове переопределенных методов из __init__()?

Вы есть. Привязка self уже произошла до оценки __init__().

Дизайнер класса предков, оставленный на милость моего дизайнера подкласса?

Это универсально верно и не имеет ничего общего с __init__() или чем-либо еще.

Разработчики подкласса могут сделать что угодно . Кроме того, это Python: у них есть ваш источник, и он также может его изменить.

Если дизайнер подкласса вызывает my __init__() до того, как он инициализирует свои атрибуты данных, которые будут использоваться одним из его переопределенных методов, и я вызываю этот метод, я получаю ошибку программы!

Правильно. Это произойдет, если дизайнер подкласса выберет имя, которое вы уже уже используете . Они заверили, что программа потерпит неудачу, выбрав имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...