En general, si usted necesita para conservar el estado entre una llamada a una función y el siguiente, lo que quiere es o bien un objeto (su solución) o un generador. En algunos casos, uno será más simple que el otro, pero no hay nada incorrecto con la forma en que lo ha hecho, en principio (aunque parece que tiene algunos problemas con la implementación).
La sugerencia de Sven, itertools.count()
, es un generador. Su puesta en práctica es algo como esto:
def count():
i = 0
while True:
yield i
i += 1
Ahora, si usted quiere que sea exigible como una función, en lugar de tener que hacer next(c)
, se podría definir un envoltorio que lo hizo tan:
def count(c=itertools.count()):
return next(c)
O lo inevitable lambda de una línea:
count = lambda c=itertools.count(): next(c)
Entonces count()
devuelve el siguiente número entero cada vez que la llame.
Por supuesto, si usted quiere ser capaz de crear cualquier número de funciones que se puede llamar, cada uno con su propio contador, se puede escribir una fábrica para que:
def counter():
return lambda c=itertools.count(): next(c)
Entonces es:
c = counter()
print c() # 0
print c() # 1
# etc
Esto todavía me parece más simple que un objeto, pero no por mucho. Si su estado o lógica fuera más complejo, la encapsulación del objeto podría ganar.
¿Estás seguro de que tu código está funcionando? El método '__get __()' solo se llama cuando se recupera un atributo de una clase de estilo nuevo, que no parece estar sucediendo aquí. –
Sí, funciona bien. ¿Quiere decir que solo debería funcionar si lo hago: 'number = new Incrementer()'? ¿Porqué es eso? –
[Dudo que su código imprima '0 1 2'] (http://ideone.com/kvCE1). Y no estoy hablando de 'number = new Incrementer()' - pareces estar confundiendo idiomas aquí, no hay un operador 'new' en Python. Estoy hablando de la invocación de [descriptors] (http://docs.python.org/reference/datamodel.html#descriptors). –