Betrachten Sie das folgende kleine Python GUI-Programm, in dem der Benutzer eine Taste über und über, um zwischen Fenster 2 1 und Fenster klicken:Python-Objekt Instanziierung aus einem anderen Objekt - ist es ein Speicherleck?
import tkinter
class Window1:
def __init__(self, parent):
# Initialize a new GUI window
self.parent = parent
self.window = tkinter.Toplevel(self.parent)
self.window.title('Window 1')
# Make a button to launch Window 2
launch_window_2_button = tkinter.Button(self.window, text='Launch Window 2')
launch_window_2_button.config(command=self.launch_window_2)
launch_window_2_button.pack()
def launch_window_2(self):
self.window.destroy()
Window2(self.parent)
class Window2:
def __init__(self, parent):
# Initialize a new GUI window
self.parent = parent
self.window = tkinter.Toplevel(self.parent)
self.window.title('Window 2')
# Make a button to launch Window 1
launch_window_1_button = tkinter.Button(self.window, text='Launch Window 1')
launch_window_1_button.config(command=self.launch_window_1)
launch_window_1_button.pack()
def launch_window_1(self):
self.window.destroy()
Window1(self.parent)
if __name__ == "__main__":
# Initialize and hide the root GUI
# (each class will spawn a new window that is a child of the root GUI)
root = tkinter.Tk()
root.withdraw()
Window1(root) # Start by spawning Window 1
root.mainloop()
Frage 1: Da jede neue Klasse von innen instanziiert wird eine andere Klasse, ist das ein Speicherleck?
Frage 2: Ist dies die korrekte und pythonische Art, diese Anwendung zu programmieren?
Frage 3: Unter der Annahme, dass die Antwort auf Frage 1 ist nicht, was passiert, wenn ich Window1(self.parent)
-self.something = Window1(self.parent)
geändert. Jetzt wo es eine Referenz gibt, ist es jetzt ein Speicherleck?
Ein Speicherverlust ist, wenn Sie Speicher nicht freigeben, wenn es nicht mehr verwendet wird. Wenn Sie beispielsweise über ein Programm verfügen, das Zeilen aus einer Datei liest und für jede Zeile neuen Speicher reserviert, den Speicher einer Zeile jedoch nie freigibt, bevor Sie die nächste Zeile lesen, handelt es sich um ein Speicherleck. Es gibt keine Möglichkeit, diesen Speicher freizugeben, da Sie keinen Verweis mehr darauf haben, so dass die von Ihrem Programm verwendete Speichermenge wächst und wächst. Python verwaltet den Speicher für Sie, und in diesem Szenario würde der Speicher automatisch freigegeben werden. Wie oder wo ein Objekt instanziiert wird, hat damit nichts zu tun. – kindall