statische Variablen innerhalb einer python-Methode
In eine Python-Methode, ich möchte eine lokale variable, deren Wert bleibt zwischen den aufrufen der Methode.
Diese Frage zeigt, wie zu erklären, wie "statische Variablen" (c++ Terminologie) innerhalb von Funktionen. Ich habe versucht, das gleiche zu tun in einer Instanz-Methode, und war gescheitert.
Hier ist ein funktionierendes minimal-Beispiel, das das problem reproduziert. Sie können kopieren und fügen Sie es in einen Dolmetscher.
class SomeClass(object):
def some_method(self):
if not hasattr(SomeClass.some_method, 'some_static_var'):
SomeClass.some_method.some_static_var = 1 # breaks here
for i in range(3):
print SomeClass.some_method.some_static_var
SomeClass.some_method.some_static_var += 1
if __name__ == '__main__':
some_instance = SomeClass()
some_instance.some_method()
Auf die Zeile mit der Bezeichnung "# bricht hier", ich:
AttributeError: 'instancemethod' object has no attribute 'some_static_var'
Merke ich, es gibt einen einfachen workaround, wo ich some_static_var
eine member-variable des SomeClass
. Doch die variable hat wirklich keine Verwendung außerhalb der Methode, also ich würde viel lieber halten Sie es aus, unübersichtlich SomeClass
' - namespace, wenn ich könnte.
- Was
SomeClass.some_method.im_func.some_static_var = 1
(Vorausgesetzt python2)
Du musst angemeldet sein, um einen Kommentar abzugeben.
In python 2, Sie haben für den Umgang mit gebundenen und ungebundenen Methoden. Diese haben nicht eine
__dict__
Attribut, wie Funktionen haben:In python 3, dein code funktioniert einwandfrei! Das Konzept des gebundenen/ungebundenen Methoden ist Weg, alles ist eine Funktion.
Zurück zu Ihr code arbeiten, müssen Sie das Attribut, auf das Ding, das hat ein
__dict__
: die eigentliche Funktion:Lesen Sie mehr auf
im_func
und__func__
hierIst es an Ihnen zu entscheiden, ob dies macht den code mehr oder weniger lesbar, für mich, so dass diese Arten von Dinge, die Attribute der Klasse ist fast immer der Weg zu gehen; es spielt keine Rolle, dass nur eine Methode ist der Zugriff auf Sprach-Attribut, ist es, wo ich suchen Sie für "statische" Typ-vars. Ich Wert lesbaren code auf saubere namespaces.
Dieser Letzte Absatz war natürlich eine Redaktion, jeder darf seine Meinung haben 🙂
Können Sie nicht festlegen-Attribut-Methode-Objekte.
Erstellen Klasse Parametern statt (das ist
SomeClass.some_var = 1
) ist die standard-Python-Weg. Jedoch können wir vorschlagen, mehr entsprechenden Updates, wenn Sie uns ein high-level-überblick über Ihre aktuellen problem (was werden Sie schreiben den code für?).Verwenden Sie die
global
keyword auf file-Ebene-VariablenAusgänge:
Obwohl, wie an anderer Stelle erwähnt, eine Klasse variable vorzuziehen wäre