Vorrei memorizzare alcune informazioni su una classe come variabili di classe (statiche). Tuttavia, non riesco a capire come queste cose vengano inizializzate. Ecco un semplice, ad esempio stupido:Inizializzazione variabile classe Python
class A(object):
clsVar = 'a'
@classmethod
def clsMeth(cls):
print 'changing clsVar'
cls.clsVar = 'b'
A.clsMeth()
# prints 'changing clsVar'
print A.clsVar # prints 'a'
A.clsVar = 'b'
print A.clsVar # prints 'b'
Poiché la funzione stato chiamato (come l'istruzione print ha lavorato), perché non la permanenza variabile di classe è cambiato? Devo usare un metaclasse se non voglio farlo dopo che la definizione della classe è completa?
[In particolare, voglio che clsMeth
sia un decoratore e che la variabile di classe sia un elenco di tutte le funzioni che sono state così decorate. Immagino che questo non sia il modo giusto per realizzarlo, quindi sono andato avanti, ma sono ancora curioso.]
EDIT: Come molti hanno sottolineato, il codice sopra ha vinto " t correre. Lo stavo eseguendo in una sessione IPython in cui la chiamata a A.clsMeth()
faceva riferimento a una versione precedente di A
ed eseguita. Tali sono i rischi dell'uso di un linguaggio interpretato, immagino. Ho finito per andare con qualcosa di simile:
outsideDict = {}
def outsideDec(func):
outsideDict[func.__name__] = func
class A(object):
@outsideDec
def someMethod(self):
print 'ID %s' % id(self)
def otherMethod(self):
print 'other'
print outsideDict
one, two = A(), A()
outsideDict['someMethod'](one)
outsideDict['someMethod'](two)
Forse questo dovrebbe essere un'altra domanda, ma quando outsideDec
viene investito, c'è un modo per dire quale classe è argomento è un membro del? O c'è un modo migliore di fare introspezioni come questa in Python? Riconosco che sto virando fuori rotta, quindi accetterò la risposta qui sotto e farò ulteriori ricerche. Grazie a tutti!
Quello che ottengo è un errore quando si chiama 'A.clsMeth' perché' A' non è definito. Forse stai usando l'interprete e hai una vecchia definizione di 'A'? – jcollado
Come si esegue questo esempio? Questo non può funzionare in quanto la sintassi non è corretta. 'A.clsMth()' non può essere posizionato come questo all'interno della definizione della classe. – gecco
@gecco: certo che può; la sintassi va bene. Fallirà con un errore di runtime, come menzionato da jcollado, dato che l'assegnazione a 'A' non ha avuto luogo quando viene richiamato' A.clsMeth() ', ma è possibile farlo. –