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
getattr
augmentera AttributeError
si 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 getattr
avecdir
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 à getattr
il y a setattr
qui 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'
>>>