El establecimiento de un atributo de la clase con un nombre dado en Python, mientras que la definición de la clase
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?
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)
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