Les objets en Python peuvent avoir des attributs - des attributs de données et des fonctions pour fonctionner avec ces (méthodes). En fait, chaque objet a des attributs intégrés.
Par exemple , vous avez un objet person, qui a plusieurs attributs: name, gender, etc.
Vous accédez à ces attributs (que ce soit des méthodes ou des objets de données) écrit habituellement: person.name, person.gender,person.the_method() , etc.
Mais que faire si vous ne connaissez pas le nom de l'attribut au moment où vous écrivez le programme? Par exemple, le nom de l'attribut est stocké dans une variable appelée attr_name.
si
attr_name = 'gender'
alors, au lieu d'écrire
gender = person.gender
tu peux écrire
gender = getattr(person, attr_name)
Un peu de pratique:
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
>>> class Person():
... name = 'Victor'
... def say(self, what):
... print(self.name, what)
...
>>> getattr(Person, 'name')
'Victor'
>>> attr_name = 'name'
>>> person = Person()
>>> getattr(person, attr_name)
'Victor'
>>> getattr(person, 'say')('Hello')
Victor Hello
getattraugmentera AttributeErrorsi l'attribut avec le nom donné n'existe pas dans l'objet:
>>> getattr(person, 'age')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'age'
Mais vous pouvez passer une valeur par défaut comme troisième argument, qui sera retourné si cet attribut n'existe pas:
>>> getattr(person, 'age', 0)
0
Vous pouvez utiliser getattravecdir pour parcourir tous les noms d'attributs et obtenir leurs valeurs:
>>> dir(1000)
['__abs__', '__add__', ..., '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> obj = 1000
>>> for attr_name in dir(obj):
... attr_value = getattr(obj, attr_name)
... print(attr_name, attr_value, callable(attr_value))
...
__abs__ <method-wrapper '__abs__' of int object at 0x7f4e927c2f90> True
...
bit_length <built-in method bit_length of int object at 0x7f4e927c2f90> True
...
>>> getattr(1000, 'bit_length')()
10
Une utilisation pratique pour cela serait de trouver toutes les méthodes dont les noms commencent par test et de les appeler .
Similaire à getattril y a setattrqui vous permet de définir un attribut d'un objet ayant son nom:
>>> setattr(person, 'name', 'Andrew')
>>> person.name # accessing instance attribute
'Andrew'
>>> Person.name # accessing class attribute
'Victor'
>>>