Переменные экземпляра в методах вне конструктора (Python) - почему и как?

Мои вопросы касаются переменных экземпляра, которые инициализируютсяв методах вне конструктора класса, Это для Python.

Сначала я скажу, что я понимаю:

Классы могут определять конструктор, а также другие методы.Переменные экземпляра обычно определяются / инициализируются в конструкторе.Но переменные экземпляра также могут быть определены / инициализированывне конструктор, например в других методах того же класса.

Пример (2) и (3) - см.self.meow а такжеself.roar вКошка класс ниже:

class Cat():

    def __init__(self):
        self.meow = "Meow!"
    def meow_bigger(self):
        self.roar = "Roar!"

Мои вопросы:

Почему рекомендуется инициализировать переменную экземпляра в конструкторе?

Какой общий / специфический беспорядок может возникнуть, если переменные экземпляра регулярно инициализируются в методах, отличных от конструктора? (Например, прочитав руководство Марка Лутца по Tkinter в его Python для программирования, которое я считаю превосходным, я заметил, что переменная экземпляра, используемая для хранения объектов / ссылок PhotoImage, была инициализирована в дальнейших методах, а не в конструкторе. проблема там, но может ли эта практика вызвать проблемы в долгосрочной перспективе?)

В каких сценариях это будетлучше инициализировать переменные экземпляра в других методах, а не в конструкторе?

Насколько мне известно, переменные экземпляра существуют не тогда, когда создается объект класса, апосле объект класса создается. Исходя из моего кода выше, я демонстрирую это:

>> c = Cat() 
>> c.meow
'Meow!'
>> c.roar
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Cat' object has no attribute 'roar'
>>> c.meow_bigger()
>>> c.roar
'Roar!'

Как было:

Я не могу получить доступ к переменной экземпляра (c.roar) вначале.Однако после того, как я вызвал метод экземпляраc.meow_bigger () однажды я внезапно смог получить доступ к переменной экземпляраc.roar.Почему вышеупомянутое поведение так?

Спасибо за помощь с моим пониманием.

Ответы на вопрос(6)

Ваш ответ на вопрос