Come si imposta a livello di codice un attributo?


204

Supponiamo che io sono un oggetto di pitone xe una stringa s, come faccio a impostare l'attributo ssu x? Così:

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

Qual è la magia? L'obiettivo di questo, per inciso, è quello di memorizzare nella cache le chiamate x.__getattr__().

Risposte:


289
setattr(x, attr, 'magic')

Per aiuto su di esso:

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

Modifica: Tuttavia, dovresti notare (come sottolineato in un commento) che non puoi farlo in un'istanza "pura" di object. Ma è probabile che tu abbia una semplice sottoclasse di oggetti in cui funzionerà bene. Esorto caldamente l'OP a non creare mai istanze di oggetti del genere.


12
Attenzione, tuttavia, questo non funziona nel tuo scenario in cui stai creando un'istanza di object ().
S. Lott,

3
Assolutamente giusto, non lo è. L'ho ignorato convenientemente. Esorto caldamente l'OP a non creare mai istanze di oggetti del genere.
Ali Afshar,

2
Peccato che non funzioni in tutti i casi, poiché sarebbe molto utile, ad esempio, per aggiungere l' dirtyattributo all'input dell'utente ...
brice

1
@Brice: setattr funziona in quasi tutti i casi. Per efficienza e altri motivi, "oggetto" è programmato in modo tale da non poter aggiungere ulteriori attributi ad esso. Puoi farlo con la tua classe con l' __slots__attributo.
dirkjot,

4
Anche questo non funziona int. Puoi spiegare perché? (è tutto qui __builtin__?
Jens Timmerman,

53

Di solito, definiamo le classi per questo.

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

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

Tuttavia, è possibile, in una certa misura, farlo con le funzioni integrate setattre getattr. Tuttavia, non funzionano su istanze di objectdirettamente.

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

Tuttavia, funzionano su tutti i tipi di classi semplici.

class YClass( object ):
    pass

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

25
Qualche idea sul perché questo non funziona con le istanze di object ()?
meawoppl

@meawoppl Dovresti porlo come una nuova domanda
Tobias Kienzler,

Alla domanda qui .
jalanb,

1
posso farlo con i moduli, invece che con le classi?
bonobo,

21

lascia che x sia un oggetto, quindi puoi farlo in due modi

x.attr_name = s 
setattr(x, 'attr_name', s)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.