L'impostazione di un attributo di classe con un nome in python durante la definizione della classe

StackOverflow https://stackoverflow.com/questions/2519807

  •  22-09-2019
  •  | 
  •  

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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top