Come accedere all'attributo oggetto data stringa corrispondente al nome di quell'attributo


154

Come imposti / ottieni i valori degli attributi di tdato da x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

Risposte:


285

Ci sono funzioni integrate chiamate getattresetattr

getattr(object, attrname)
setattr(object, attrname, value)

In questo caso

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

12
C'è anche delattr per l'eliminazione degli attributi, ma questo è usato raramente.
Dave Kirby,

11
e hasattr per verificare se un oggetto ha o meno un attr specifico anche se in quel caso è spesso meglio usare il modulo a tre argomenti getattr (oggetto, attrname, default).
Duncan,

c'è comunque che possiamo usare getattr in questo modo e dire che ho un dataframe df1e una variabile x = 'df1'cioè df1 come stringa in var x. voglio stampare la forma di df in questo modo getattr(x, 'shape')o getattr('df1', 'shape'). So che questo non può essere fatto con getattr, nessun altro metodo.
ihightower

puoi farlogetattr(globals()[x], 'shape')
dopo

3

Nota: questa risposta è molto obsoleta. Si applica a Python 2 utilizzando il newmodulo che è stato deprecato nel 2008 .

Esistono funzioni integrate in python setattr e getattr. Quale può essere usato per impostare e ottenere l'attributo di una classe.

Un breve esempio:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

0

Se vuoi mantenere la logica nascosta all'interno della classe, potresti preferire utilizzare un metodo getter generalizzato in questo modo:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

Uscite:

Attribute value of attr1 is 1

Un altro approccio che potrebbe nasconderlo ancora meglio sarebbe usare il metodo magico __getattribute__, ma ho continuato a ottenere un ciclo infinito che non ero in grado di risolvere quando provavo a recuperare il valore dell'attributo all'interno di quel metodo.

Si noti inoltre che è possibile utilizzare in alternativa vars(). Nell'esempio di cui sopra, si potrebbe scambiare getattr(self,varname)per return vars(self)[varname], ma getattrpotrebbe essere preferibile in base alla risposta alla Qual è la differenza tra varse setattr? .

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.