2016-07-14 32 views
2

Warum kann ichPython: Was ist der Sinn der Klasse Instanziierung ohne variable

class MyApp(App): 
    def build(self): 
     return Label(text="Hello World") 

MyApp().run() 

anstatt das zu tun

instance = MyApp() 

    instance.run() 

ich OOP recht neu bin und war ziemlich verwirrt, wenn ich Sachen gesehen geschrieben in der Art des ersten Code-Snippets. Gibt es einen Grund, warum dies so häufig vorkommt?

Gibt es einen funktionalen Unterschied zwischen den beiden?

+4

Weniger tippen, vor allem, wenn Sie diese 'instance 'Variable nach dem Aufruf von' .run' nie wiederverwenden werden. Wir sind nur faul und brauchen/wollen in diesem Fall die Instanz nicht in einer Variablen behalten. – Bahrom

Antwort

4

Im ersten Codeblock machen Sie im Prinzip dasselbe wie im zweiten Codeblock. Der Unterschied ist, dass in der ersten Sie die instanziierte MyApp() - Klasse nicht erneut verwenden können.

Im zweiten Beispiel definieren Sie jedoch ein Objekt, das wiederverwendet werden kann.

EDIT

Wie @arekolek erklärte:

Wenn Sie MyApp.run() verwenden, anstatt sie einer Variablen zugewiesen, Python wird das von dem Objekt belegten Speicher freizugeben, sobald die Aufruf für die Methode run() ist beendet.

P. S: Ich bin kein Profi in Python verwechselt werden könnte ...

+1

Sie sind nicht falsch. –

+1

@MadPhysicist oh danke! Das ist eine Erleichterung –

+0

Ich bin froh zu hören, dass Sie nicht mehr unter Spannung sind :) –

0

Es ist mehr als nur nicht das instanziiert MyApp() Objekt wiederverwenden zu können.

Mit MyApp.run() anstatt es einer Variablen zuzuweisen, kann Python den vom Objekt belegten Speicher freigeben, sobald der Aufruf run() abgeschlossen ist.

Im zweiten Beispiel müssen Sie manuell del instance, wenn Sie den Speicher freigeben möchten. Der Speicher wird auch freigegeben, sobald Sie den Block verlassen, in dem die instance definiert wurde. Zum Beispiel:

+0

Ist das wahr? Ich würde annehmen, dass die 'run' Methode die Instanz in jeder Schleife benötigt und nicht erlaubt, dass der Speicher gesammelt wird. –

+0

Mit "jeder Schleife" meinst du jeden der drei Aufrufe in meinem Beispiel? Jedes 'run()' in meinem Code verwendet eine eigene Instanz der 'MyApp' Klasse, also ist es wahr. – arekolek

+0

Betrachten Sie eine Klasse mit einer Instanzvariable 'count' und einer Instanzmethode' run'. Der Rumpf von 'run' erhöht" count ", gibt diesen Wert aus, wartet eine Sekunde und ruft dann selbst auf. Sobald 'run' aufgerufen wird, kann die Instanz nicht mehr gesammelt werden, da sie noch benötigt wird. In Ihrem Code entfernt 'del instance' nur' instance' aus dem lokalen Namespace und dekrementiert seine Referenzzahl (was eine Garbage Collection ermöglicht, wenn keine Referenzen mehr vorhanden sind). "Del" selbst tut nichts mit dem tatsächlichen Speicher, der von einem Objekt verwendet wird. –