L'impostazione di un attributo di classe con un nome in python durante la definizione della classe
Domanda
che sto cercando di fare qualcosa di simile:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
Ma io non riesco a trovare il riferimento alla classe per ottenere il setattr
a lavorare lo stesso come solo l'assegnazione di una variabile nella definizione della classe. Come posso fare questo?
Soluzione
È necessario utilizzare un metaclasse per questo:
property = 'foo'
value = 'bar'
class MC(type):
def __init__(cls, name, bases, dict):
setattr(cls, property, value)
super(MC, cls).__init__(name, bases, dict)
class C(object):
__metaclass__ = MC
print C.foo
Altri suggerimenti
Si può fare ancora più semplice:
class A():
vars()['key'] = 'value'
In contrasto con la risposta precedente, questa soluzione gioca bene con metaclassi esterni (per es., Modelli di Django).
Questo può essere perché il A
classe non è completamente inizializzato quando fate la vostra setattr(A, p, v)
lì.
La prima cosa da provare sarebbe quella di spostare solo il settattr fino a dopo la chiusura del blocco class
e vedere se funziona, per esempio.
class A(object):
pass
setattr(A, property, value)
In caso contrario, che cosa Ignacio appena detto circa metaclassi .
Quindi, so che questo è molto vecchio e probabilmente battere un cavallo morto e questo non sarebbe stato possibile al momento, ma ho cam attraverso questo cercando di risolvere il mio problema.
ho capito che questo può essere realizzato senza metaclassing.
Il setattr prende e oggetto, accessor nome e valore. Beh, l'oggetto non è il nome della classe è l'istanza specifica della classe, che può essere realizzato con sé.
class A(object):
def __init__(self):
self.a = 'i am a accessor'
setattr(self, 'key', 'value')
a = A()
print a.a
print a.key