¿Cómo se establece un atributo mediante progtwigción?

Supongamos que tengo un objeto python x una cadena s , ¿cómo configuro el atributo s en x ? Asi que:

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

¿Qué es la magia? El objective de esto, por cierto, es cachear las llamadas a x.__getattr__() .

 setattr(x, attr, 'magic') 

Para obtener ayuda sobre esto:

 >>> 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 ``xy = v''. 

Edición: Sin embargo, debe tener en cuenta (como se señaló en un comentario) que no puede hacer eso a una instancia “pura” de object . Pero es probable que tengas una subclase simple de objeto donde funcionará bien. Insto encarecidamente a la OP a que nunca haga ejemplos de objetos como ese.

Por lo general, 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 las getattr incorporadas setattr y getattr . Sin embargo, no funcionan directamente en instancias de object .

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

Ellos, sin embargo, trabajan en todo tipo de clases simples.

 class YClass( object ): pass y= YClass() setattr( y, 'myAttr', 'magic' ) y.myAttr 

deja que x sea un objeto, entonces puedes hacerlo de dos maneras

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