Instanzvariablen in Methoden außerhalb des Konstruktors (Python) - warum und wie?

Meine Fragen betreffen Instanzvariablen, die initialisiert werdenin Methoden außerhalb des Klassenkonstruktors. Dies ist für Python.

Ich gebe zuerst an, was ich verstehe:

Classes kann einen Konstruktor und andere Methoden definieren.Instanzvariablen werden im Allgemeinen im Konstruktor definiert / initialisiert.Aber Instanzvariablen können auch definiert / initialisiert werdendrauße der Konstruktor, z. in den anderen Methoden der gleichen Klasse.

Ein Beispiel für (2) und (3) - siehe self.meow und self.roar in demKatz Klasse unten:

class Cat():

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

Meine Fragen

Warum empfiehlt es sich, die Instanzvariable im Konstruktor zu initialisieren?

Was für ein allgemeines / spezifisches Durcheinander könnte entstehen, wenn Instanzvariablen regelmäßig in anderen Methoden als dem Konstruktor initialisiert werden? (ZB nachdem ich Mark Lutz 'Tkinter-Handbuch in seinem Programmier-Python gelesen hatte, das ich für ausgezeichnet hielt, bemerkte ich, dass die Instanzvariable, die zum Speichern der PhotoImage-Objekte / -Referenzen verwendet wurde, in den weiteren Methoden initialisiert wurde, nicht im Konstruktor. Es schien ohne zu funktionieren Problem dort, aber könnte diese Praxis Probleme auf lange Sicht verursachen?)

n welchen Szenarien wäre ebesse, um Instanzvariablen in den anderen Methoden anstatt im Konstruktor zu initialisieren?

Meines Wissens sind Instanzvariablen nicht vorhanden, wenn das Klassenobjekt erstellt wird, sondernnac Das Klassenobjekt wird instanziiert. In meinem obigen Code zeige ich Folgendes:

>> 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!'

Sozusagen

Ich kann nicht auf die Instanzvariable zugreifen c.roar) zunaechstNoch nachdem ich die Instanzmethode @ aufgerufen ha c.meow_bigger () einmal kann ich plötzlich auf die Instanzvariable @ zugreif c.roar.Warum ist das obige Verhalten so?

Vielen Dank, dass Sie mit meinem Verständnis aushelfen.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage