Переменные экземпляра в методах вне конструктора (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.Почему вышеупомянутое поведение так?Спасибо за помощь с моим пониманием.