2011-03-13 6 views
5

Tengo una clase con diez contadores diferentes. Necesito incrementar uno u otro de estos en tiempo de ejecución, y al método de incremento se le dice el nombre del contador para incrementar.¿Cómo incremento un atributo en tiempo de ejecución usando getattr/setattr?

Me pregunto si hay una manera más limpia que esto:

def increment(self, name): 
    """Increments a counter specified by the 'name' argument.""" 
    setattr(self, name, getattr(self, name) + 1) 
  • no estoy terriblemente preocupado por las condiciones de carrera y similares.
  • No, no puede cambiar la forma en que se llama a la función. Obviamente, el código real es un poco menos trivial que el ejemplo.
+0

¿Sería posible tener un diccionario de nombres en los contadores? –

+0

Como se señala en los comentarios de las respuestas a continuación, no, no tiene un diccionario de contadores. –

Respuesta

6

Puede almacenar los contadores en un diccionario en lugar de los atributos.

Como alternativa, se puede usar

def increment(self, name): 
    """Increments a counter specified by the 'name' argument.""" 
    self.__dict__[name] += 1 

Depende de usted decidir si esto es "más limpia".

+0

No puedo cambiar cómo se almacenan los contadores; son campos en un modelo django. El truco de '__dict__' es bueno, sin embargo. –

+0

Por supuesto, tener los contadores en ' .__ dict__' * es * almacenarlos en un diccionario. – martineau

+0

Bueno, tocar '__dict__' parece bastante sucio, pero parece que es la única alternativa para obtener/setattr en este caso. ¡Gracias por la sugerencia, sin embargo! –

Cuestiones relacionadas