Anstatt eine Funktion mit einer statischen lokalen Variablen zu erstellen, können Sie auch ein sogenanntes "Funktionsobjekt" erstellen und ihm eine (nicht statische) Standardvariable geben.
Da Sie ein Beispiel gegeben haben, das in C++ geschrieben wurde, werde ich zunächst erklären, was ein "Funktionsobjekt" in C++ ist. Ein "Funktionsobjekt" ist einfach jede Klasse mit einer überladenen operator()
. Instanzen der Klasse verhalten sich wie Funktionen. Sie können zum Beispiel schreiben int x = square(5);
même si square
ist ein Objekt (mit überladenen operator()
) und ist technisch gesehen keine "Funktion". Sie können einem Funktionsobjekt alle Eigenschaften geben, die Sie auch einem Klassenobjekt geben können.
# C++ function object
class Foo_class {
private:
int counter;
public:
Foo_class() {
counter = 0;
}
void operator() () {
counter++;
printf("counter is %d\n", counter);
}
};
Foo_class foo;
In Python können wir auch überladen operator()
mit dem Unterschied, dass die Methode stattdessen den Namen __call__
:
Hier ist eine Klassendefinition:
class Foo_class:
def __init__(self): # __init__ is similair to a C++ class constructor
self.counter = 0
# self.counter is like a static member
# variable of a function named "foo"
def __call__(self): # overload operator()
self.counter += 1
print("counter is %d" % self.counter);
foo = Foo_class() # call the constructor
Hier ist ein Beispiel für die Verwendung der Klasse:
from foo import foo
for i in range(0, 5):
foo() # function call
Die Ausgabe auf der Konsole lautet:
counter is 1
counter is 2
counter is 3
counter is 4
counter is 5
Wenn Sie möchten, dass Ihre Funktion Eingabeargumente akzeptiert, können Sie diese zu __call__
auch:
# FILE: foo.py - - - - - - - - - - - - - - - - - - - - - - - - -
class Foo_class:
def __init__(self):
self.counter = 0
def __call__(self, x, y, z): # overload operator()
self.counter += 1
print("counter is %d" % self.counter);
print("x, y, z, are %d, %d, %d" % (x, y, z));
foo = Foo_class() # call the constructor
# FILE: main.py - - - - - - - - - - - - - - - - - - - - - - - - - - - -
from foo import foo
for i in range(0, 5):
foo(7, 8, 9) # function call
# Console Output - - - - - - - - - - - - - - - - - - - - - - - - - -
counter is 1
x, y, z, are 7, 8, 9
counter is 2
x, y, z, are 7, 8, 9
counter is 3
x, y, z, are 7, 8, 9
counter is 4
x, y, z, are 7, 8, 9
counter is 5
x, y, z, are 7, 8, 9
33 Stimmen
Es gibt NO Gleichwertigkeit, fürchte ich. Selbst wenn man den Decorator-Hack mit Funktionsattributen durchführt, kann man auf die Variable von außen zugreifen, was den Sinn der Sache leider zunichte macht. Außerdem müssen Sie den Funktionsnamen in der Funktion hart codieren, was sehr ärgerlich ist. Ich würde vorschlagen, stattdessen globale Variablen einer Klasse oder eines Moduls zu verwenden, mit der konventionellen
_
Vorwahl.17 Stimmen
Für Nicht-C-Programmierer, [ [stackoverflow.com/questions/5033627/](https://stackoverflow.com/questions/5033627/static-variable-inside-of-a-function-in-c#5033656](a "static variable inside of a function in c%235033656%5d(a") statische Variable innerhalb einer Funktion ist nur innerhalb des Funktionsbereichs dieser Funktion sichtbar, aber ihre Lebensdauer ist die gesamte Lebensdauer des Programms, und sie wird nur einmal initialisiert). Im Grunde genommen handelt es sich um einen dauerhaften Zähler oder eine Speichervariable, die zwischen Funktionsaufrufen lebt.
2 Stimmen
@lpapp: Irgendwie schon, es ist ein Klassenmitglied . Sie haben Recht, dass wir nicht verhindern können, dass andere Codes sie anzeigen oder ändern.
0 Stimmen
Ich fand respuesta gegeben von Claudiu nützlich.