2008-11-12 12 views
135

Supongamos que tengo un objeto python x y una cadena s, ¿cómo configuro el atributo s en x? Entonces:¿Cómo configura programáticamente un atributo?

>>> x = SomeObject() 
>>> attr = 'myAttr' 
>>> # magic goes here 
>>> x.myAttr 
'magic' 

¿Cuál es la magia? El objetivo de esto, por cierto, es almacenar en caché las llamadas al x.__getattr__().

Respuesta

208
setattr(x, attr, 'magic') 

Para obtener ayuda sobre el mismo:

>>> help(setattr) 
Help on built-in function setattr in module __builtin__: 

setattr(...) 
    setattr(object, name, value) 

    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to 
    ``x.y = v''. 

Editar: Sin embargo, debe tener en cuenta (como se ha señalado en el comentario) que no se puede hacer eso a una instancia de "puro" del objeto. Pero es probable que tengas una subclase simple de objeto donde funcione bien. Recomiendo encarecidamente al O.P. que nunca haga instancias de objetos así.

+8

cuidado, sin embargo, esto no funciona en su escenario en el que está creando una instancia de objeto(). –

+3

Absolutamente correcto, no es así. Convenientemente ignoré eso. Recomiendo encarecidamente al O.P. que nunca haga instancias de objetos así. –

+0

+1: "nunca hagas instancias de objetos como ese" –

40

Normalmente, definimos clases para esto.

class XClass(object): 
    def __init__(self): 
     self.myAttr= None 

x= XClass() 
x.myAttr= 'magic' 
x.myAttr 

Sin embargo, puede, hasta cierto punto, hacer esto con los setattr y getattr funciones incorporadas. Sin embargo, no funcionan en instancias de object directamente.

>>> a= object() 
>>> setattr(a, 'hi', 'mom') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'hi' 

Sin embargo, funcionan en todo tipo de clases simples.

class YClass(object): 
    pass 

y= YClass() 
setattr(y, 'myAttr', 'magic') 
y.myAttr 
+19

¿Alguna idea de por qué esto no funciona con instancias de object()? – meawoppl

+0

@meawoppl Deberías preguntar eso como una [nueva pregunta] (http://stackoverflow.com/questions/ask) –

10

Sea X un objeto a continuación, puede hacerlo de dos maneras

x.attr_name = s 
setattr(x, 'attr_name', s) 
Cuestiones relacionadas