2011-11-13 14 views
13

Duplicar posible:
Static class variables in Python
What is the Python equivalent of static variables inside a function?¿Miembro estático de una función en Python?

¿Cómo puedo usar los campos estáticos en Python?

por ejemplo, quiero contar cuántas veces se ha llamado a la función, ¿cómo puedo hacer esto?

+0

de acuerdo: duplicado – gecco

+0

@PaulManta: I d isagree Su enlace no está relacionado con los campos estáticos de la clase (como dice OP), sino con "_ el miembro estático en el nivel de función, en oposición al nivel de clase_", como lo establece OP en la pregunta a la que dio un enlace de uso. – Tadeck

+2

@Tadeck La palabra 'clase' ni siquiera aparece en la pregunta ...Pero la frase 'miembro estático ** de una función **' sí lo hace. –

Respuesta

4

Si desea contar cuántas veces un método que se ha llamado, no importa qué instancia lo llamó, se puede utilizar un miembro de la clase de esta manera:

class Foo(object): 
    calls=0   # <--- call is a class member 
    def baz(self): 
     Foo.calls+=1 

foo=Foo() 
bar=Foo() 
for i in range(100): 
    foo.baz() 
    bar.baz() 
print('Foo.baz was called {n} times'.format(n=foo.calls)) 
# Foo.baz was called 200 times 

Al definir calls esta manera :

class Foo(object): 
    calls=0    

Python coloca el par clave-valor ('llamadas', 0) en Foo.__dict__.

Puede ser visitada con Foo.calls. Las instancias de Foo, como foo=Foo(), también pueden acceder a ella con foo.calls.

Para asigne nuevos valores a Foo.calls debe utilizar Foo.calls = .... Las instancias no pueden usar foo.calls = ... porque esto hace que Python coloque un par nuevo y diferente de clave-valor en foo.__dict__, donde se guardan los miembros de la instancia.

3

Aquí es un poco de ejemplo, contando el número de llamadas de todos los objetos de la misma clase:

class Swallow(): 
    i = 0 # will be used for counting calls of fly() 
    def fly(self): 
     Swallow.i += 1 

Y esta es la prueba:

>>> a = Swallow() 
>>> b = Swallow() 
>>> a.fly() 
>>> a.i 
1 
>>> Swallow.i 
1 
>>> b.fly() 
>>> b.i 
2 
>>> Swallow.i 
2 

para que pueda leerlo dando el objeto nombre o nombre de clase.

3

Aquí hay un decorador que agrega el conteo a una función.

import functools 

def count_calls(func): 
    @functools.wraps(func) 
    def decor(*args, **kwargs): 
     decor.count += 1 
     return func(*args, **kwargs) 
    decor.count = 0 
    return decor 

Uso:

>>> @count_calls 
... def foo(): 
...  pass 
... 
>>> foo.count 
0 
>>> foo() 
>>> foo.count 
1 
+0

el decorador podría ser mejor llamado 'count_calls' – jfs

+0

de acuerdo, lo he cambiado – yak

+0

Es la forma más complicada de hacerlo, ¿no? – Patryk

1

Ésta es una forma simplista de hacerlo:

def func(): 
    if not hasattr(func, 'counter'): 
     func.counter = 0 
    func.counter += 1 
    counter = 0 # Not the same as `func.counter` 
    print(func.counter) 

O si no te gusta el caso de ser ejecutado en cada llamada, se puede hacer:

def func(): 
    func.counter += 1 
    print(func.counter) 
func.counter = 0 
Cuestiones relacionadas