Variáveis de instância em métodos fora do construtor (Python) - por que e como?
Minhas perguntas dizem respeito a variáveis de instância que são inicializadasem métodos fora do construtor de classe. Isto é para Python.
Vou primeiro declarar o que entendo:
Classes podem definir um construtor e também definir outros métodos.As variáveis de instância são geralmente definidas / inicializadas no construtor.Mas variáveis de instância também podem ser definidas / inicializadaslado de fora o construtor, por exemplo nos outros métodos da mesma classe.Um exemplo de (2) e (3) - vejaself.meow eself.roar noGato classe abaixo:
class Cat():
def __init__(self):
self.meow = "Meow!"
def meow_bigger(self):
self.roar = "Roar!"
Minhas perguntas:
Por que é uma prática recomendada inicializar a variável de instância no construtor?
Que confusão geral / específica poderia surgir se as variáveis de instância fossem regularmente inicializadas em métodos diferentes do construtor? (Por exemplo, depois de ler o guia Tkinter de Mark Lutz em seu Programming Python, que achei excelente, notei que a variável de instância usada para armazenar os objetos / referências do PhotoImage foi inicializada em outros métodos, não no construtor. Parecia funcionar sem problema lá, mas essa prática poderia causar problemas a longo prazo?)
Em que cenários seriaMelhor inicializar variáveis de instância nos outros métodos, e não no construtor?
Que eu saiba, as variáveis de instância não existem quando o objeto de classe é criado, masdepois de o objeto de classe é instanciado. Continuando com o meu código acima, demonstro o seguinte:
>> 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!'
Por assim dizer:
Não consigo acessar a variável de instância (c.roar) no início.No entanto, depois de chamar o método de instânciac.meow_bigger () uma vez, de repente consigo acessar a variável de instânciac.roar.Por que o comportamento acima é verdade?Obrigado por ajudar com meu entendimento.