Au lieu de créer une fonction ayant une variable locale statique, vous pouvez toujours créer ce qu'on appelle un "objet fonction" et lui donner une variable membre standard (non statique).
Puisque vous avez donné un exemple écrit en C ++, je vais d'abord expliquer ce qu'est un "objet fonction" en C ++. Un "objet fonction" est simplement n'importe quelle classe avec une surcharge operator()
. Les instances de la classe se comporteront comme des fonctions. Par exemple, vous pouvez écrire int x = square(5);
même s'il square
s'agit d'un objet (surchargé operator()
) et non techniquement pas une "fonction". Vous pouvez donner à un objet-fonction n'importe laquelle des fonctionnalités que vous pourriez donner à un objet de classe.
# 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;
En Python, nous pouvons également surcharger operator()
sauf que la méthode est nommée à la place __call__
:
Voici une définition de classe:
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
Voici un exemple de la classe utilisée:
from foo import foo
for i in range(0, 5):
foo() # function call
La sortie imprimée sur la console est:
counter is 1
counter is 2
counter is 3
counter is 4
counter is 5
Si vous souhaitez que votre fonction accepte des arguments d'entrée, vous pouvez également les ajouter à __call__
:
# 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
_
préfixe conventionnel .