2011-11-29 19 views
17

Necesito hacer un montón de variables de clase y me gustaría hacerlo por bucle a través de una lista así:cómo crear dinámicamente variable de clase en Python

vars=('tx','ty','tz') #plus plenty more 

class Foo(): 
    for v in vars: 
     setattr(no_idea_what_should_go_here,v,0) 

es posible? No quiero hacerlos para una instancia (usar self en __init__) sino como variables de clase.

+2

¿Por qué no mantenerlos en dict? – DrTyrsa

+0

¿Desea compartir estas variables entre diferentes instancias? – luc

+0

no estoy seguro. más probable. el requisito proviene de una API y no sé cómo se usan allí. – pawel

Respuesta

27

Puede ejecutar el código de inserción inmediatamente después de crear una clase:

class Foo(): 
    ... 

vars=('tx', 'ty', 'tz') # plus plenty more 
for v in vars: 
    setattr(Foo, v, 0) 

Además, se puede almacenar de forma dinámica la variable mientras se crea la clase:

class Bar: 
    locals()['tx'] = 'texas' 
+0

ah. Eso es genial. Lo probaré y veré si la API con la que trabajo puede manejar eso. ¡gracias amigo! – pawel

5

Si por alguna razón no puede usar la respuesta de Raymond de configurarlos después de la creación de la clase, entonces quizás podría usar una metaclase:

class MetaFoo(type): 
    def __new__(mcs, classname, bases, dictionary): 
     for name in dictionary.get('_extra_vars',()): 
      dictionary[name] = 0 
     return type.__new__(mcs, classname, bases, dictionary) 

class Foo(): # For python 3.x use 'class Foo(metaclass=MetaFoo):' 
    __metaclass__=MetaFoo # For Python 2.x only 
    _extra_vars = 'tx ty tz'.split() 
+1

'nombre' en choques de bucle con el argumento' __new__' –

+0

@UszyWieloryba gracias, corregido – Duncan

Cuestiones relacionadas