2011-11-29 33 views
17

ho bisogno di fare un po 'di variabili di classe e mi piacerebbe farlo scorrendo un elenco del genere:come creare dinamicamente variabile di classe in Python

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

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

è possibile? Non voglio renderli per un'istanza (usando self in __init__) ma come variabili di classe.

+2

Perché non tenerli in dict? – DrTyrsa

+0

Vuoi condividere queste variabili tra diverse istanze? – luc

+0

non sono sicuro. più probabilmente. il requisito proviene da un'API e non so come vengono utilizzati lì. – pawel

risposta

27

È possibile eseguire il codice di inserimento subito dopo la creazione di una classe:

class Foo(): 
    ... 

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

Inoltre, è possibile memorizzare in modo dinamico la variabile durante la creazione della classe:

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

ah. questo è figo. Darò un tentativo e vedere se l'API con cui lavoro può gestirlo. grazie compagno! – pawel

5

Se per qualsiasi motivo non puoi utilizzare la risposta di Raymond per impostarle dopo la creazione della classe, quindi potresti utilizzare una metaclasse:

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

'name' in for loop scontri con argomento' __new__' –

+0

@UszyWieloryba grazie, corretto – Duncan

Problemi correlati