web-dev-qa-db-fra.com

Comment définissez-vous par programme un attribut?

Supposons que j'ai un objet python x et une chaîne s, comment définir l'attribut s sur x? Alors:

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

Quelle est la magie? Le but de cette opération est d'ailleurs de mettre en cache les appels à x.__getattr__().

181
Nick
setattr(x, attr, 'magic')

Pour de l'aide à ce sujet:

>>> 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''.

Edit: Cependant, vous devriez noter (comme indiqué dans un commentaire) que vous ne pouvez pas faire cela sur une instance "pure" de object. Mais il est probable que vous ayez une simple sous-classe d'objet où cela fonctionnera bien. Je demande instamment à l'O.P. de ne jamais créer d'instances d'objet de ce type.

264
Ali Afshar

Habituellement, nous définissons des classes pour cela.

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

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

Cependant, vous pouvez, dans une certaine mesure, le faire avec les fonctions intégrées setattr et getattr. Cependant, ils ne fonctionnent pas directement sur les instances de object.

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

Ils travaillent cependant sur toutes sortes de classes simples.

class YClass( object ):
    pass

y= YClass()
setattr( y, 'myAttr', 'magic' )
y.myAttr
48
S.Lott

soit x un objet, alors tu peux le faire de deux manières

x.attr_name = s 
setattr(x, 'attr_name', s)
20
vijay shanker