Comment accéder à l'attribut d'objet donné la chaîne correspondant au nom de cet attribut

154

Comment définir / obtenir les valeurs des attributs de tdonné par x?

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

t = Test()
x = "attr1"
Nullpoet
la source

Réponses:

285

Il existe des fonctions intégrées appelées getattretsetattr

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

Dans ce cas

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)
Pratik Deoghare
la source
12
Il existe également delattr pour supprimer des attributs, mais cela est rarement utilisé.
Dave Kirby
11
et hasattr pour tester si un objet a ou non un attr spécifique bien que dans ce cas, l'utilisation de la forme à trois arguments getattr (objet, attrname, par défaut) est souvent meilleure.
Duncan
y at-il de toute façon que nous pouvons utiliser getattr comme ceci et dire que j'ai une dataframe df1, et une variable x = 'df1'ie df1 comme une chaîne dans var x. je veux imprimer la forme de df comme ça, getattr(x, 'shape')ou getattr('df1', 'shape'). Je sais que cela ne peut pas être fait avec getattr, aucune autre méthode.
ihightower
vous pouvez le fairegetattr(globals()[x], 'shape')
afult
3

Remarque: cette réponse est très obsolète. Il s'applique à Python 2 en utilisant le newmodule qui était obsolète en 2008 .

Il y a python intégré aux fonctions setattr et getattr. Qui peut utilisé pour définir et obtenir l'attribut d'une classe.

Un bref exemple:

>>> 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
aatifh
la source
0

Si vous souhaitez garder la logique cachée à l'intérieur de la classe, vous pouvez préférer utiliser une méthode getter généralisée comme ceci:

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)))

Les sorties:

Attribute value of attr1 is 1

Une autre approche qui pourrait le cacher encore mieux serait d'utiliser la méthode magique __getattribute__, mais j'ai continué à obtenir une boucle sans fin que je ne pouvais pas résoudre en essayant de récupérer la valeur d'attribut dans cette méthode.

Notez également que vous pouvez également utiliser vars(). Dans l'exemple ci-dessus, vous pourriez échanger getattr(self,varname)par return vars(self)[varname], mais cela getattrpourrait être préférable selon la réponse à Quelle est la différence entre varset setattr? .

not2savvy
la source