2008-11-12 6 views
135

Supposons que j'ai un objet python x et une chaîne s, comment puis-je définir l'attribut s sur ? Donc:Comment définissez-vous un attribut par programme?

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

Quelle est la magie? L'objectif de ce, incidemment, est de mettre en cache les appels au x.__getattr__().

Répondre

208
setattr(x, attr, 'magic') 

Pour obtenir une aide sur elle:

>>> 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 devez noter (comme indiqué dans un commentaire) que vous ne pouvez pas faire cela à une instance « pure » de l'objet. Mais il est probable que vous ayez une sous-classe simple d'objet où cela fonctionnera bien. Je recommande fortement à l'O.P de ne jamais faire des instances d'objet comme ça.

+8

cependant Attention, cela ne fonctionne pas dans votre scénario où vous créez une instance d'objet(). –

+3

Tout à fait raison, ce n'est pas le cas. J'ai commodément ignoré cela. Je recommande fortement à l'O.P de ne jamais faire des instances d'objet comme ça. –

+0

+1: "ne jamais faire des instances d'objet comme ça" –

40

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, faire avec les setattr et getattr fonctions intégrées. Cependant, ils ne fonctionnent pas sur les instances de object directement.

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

Cependant, ils fonctionnent sur toutes sortes de classes simples.

class YClass(object): 
    pass 

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

Vous ne savez pas pourquoi cela ne fonctionne pas avec les instances de object()? – meawoppl

+0

@meawoppl Vous devriez le demander en tant que [nouvelle question] (http://stackoverflow.com/questions/ask) –

10

Soit x un objet, vous pouvez le faire de deux façons

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