El establecimiento de un atributo de la clase con un nombre dado en Python, mientras que la definición de la clase

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

  •  22-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de hacer algo como esto:

property = 'name'
value = Thing()
class A:
  setattr(A, property, value)
  other_thing = 'normal attribute'

  def __init__(self, etc)
    #etc..........

Pero me parece que no puede encontrar la referencia a la clase para obtener la setattr a trabajar lo mismo que acaba de asignar una variable en la definición de clase. ¿Cómo puedo hacer esto?

¿Fue útil?

Solución

Usted tendrá que utilizar una metaclase para esto:

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

Otros consejos

Puede hacerlo aún más simple:

class A():
    vars()['key'] = 'value'

En contraste con la respuesta anterior, esta solución juega bien con metaclases externos (por ej., Modelos de Django).

Esto puede ser debido a que el A clase no se ha inicializado completamente cuando usted hace su setattr(A, p, v) allí.

La primera cosa a intentar sería simplemente mover el settattr hasta después de cerrar el bloque class y ver si funciona, por ejemplo.

class A(object):
    pass

setattr(A, property, value)

Si no, lo que acaba de decirse de Ignacio metaclases .

Así que sé que esto es muy viejo y probablemente leña del árbol caído y esto puede no haber sido posible en el momento pero me leva a través de esta tratando de resolver mi propio problema.

I di cuenta de esto se puede lograr sin metaclassing.

El setattr toma y objeto, nombre de acceso y valor. Bueno, el objeto no es el nombre de la clase que es la instancia específica de la clase, que se puede lograr con uno mismo.

class A(object):
    def __init__(self):
        self.a = 'i am a accessor'
        setattr(self, 'key', 'value')

a = A()
print a.a
print a.key
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top