398 votes

Qu'est-ce que getattr () exactement et comment puis-je l'utiliser?

J'ai été lire sur l' getattr() fonction. Le problème est que je n'arrive toujours pas à comprendre l'idée de son utilisation. La seule chose que je comprends sur getattr() que getattr(li, "pop") est le même que l'appel à la li.pop.

Je ne comprenais pas quand le livre mentionné la façon dont vous l'utiliser pour obtenir une référence à une fonction sans connaître son nom jusqu'au moment de l'exécution. C'est peut-être moi qui suis un noob en programmation, en général. Quelqu'un pourrait-il éclairer à ce sujet? Quand et comment dois-je utiliser ce exactement?

1:

352voto

warvariuc Points 11787

Les objets en Python peuvent avoir des attributs. Par exemple, vous avez un objet person, qui possède plusieurs attributs: name, gender, etc. Vous pouvez accéder à ces attributs (méthodes ou des objets de données), généralement écrit: person.name, person.gender, person.the_method(), etc.

Mais que faire si vous ne connaissez pas le nom de l'attribut à la fois que vous écrivez le programme? Par exemple, vous avez de l'attribut nom stocké dans une variable nommée gender_attribute_name.

si

gender_attribute_name = 'gender'

alors, au lieu d'écrire

gender = person.gender

vous pouvez écrire

gender = getattr(person, gender_attribute_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)
... 
>>> attr_name = 'name'
>>> person = Person()
>>> getattr(person, attr_name)
'Victor'
>>> getattr(person, 'say')('Hello')
Victor Hello
>>> 

124voto

NuclearPeon Points 547

Pour moi, getattr est plus facile à expliquer de cette façon:

Il vous permet d'appeler des méthodes basées sur le contenu d'une chaîne de caractères au lieu de taper le nom de la méthode.

Par exemple, vous ne pouvez pas faire ceci:

obj = MyObject()
for x in ['foo', 'bar']:
    obj.x()

parce que x n'est pas du type "builtin", mais "str". Cependant, vous POUVEZ faire ceci:

obj = MyObject()
for x in ['foo', 'bar']:
    getattr(obj, x)()

Il vous permet de vous connecter dynamiquement avec des objets en fonction de vos suggestions. J'ai trouvé utile lorsque vous traitez avec des objets personnalisés et les modules.

60voto

Alois Cochard Points 4846

Vous pouvez voir un exemple complet ici:

L'Introspection peut être utilisé à des fins différentes, la présentation de la Plongée En Python " est simplement un moyen d'ajouter des fonctionnalités (plug-in) de manière dynamique dans votre application.

Par dynamiquement je veux dire sans faire de modification dans l'application de base pour ajouter une nouvelle fonctionnalité.

La prise de la "Dive Into Python" de l'exemple - une application simple pour extraire de l'attribut de fichier de fichier différent - vous pouvez ajouter la gestion d'un nouveau format de fichier sans faire de modification dans l'application d'origine.

Je vous recommande de terminer le livre, tout est devenu de plus en plus clairement au cours de cette...

45voto

Robert Rossney Points 43767

Un assez commun en cas d'utilisation de getattr est la cartographie de données pour les fonctions.

Par exemple, dans un framework web comme Django ou des Pylônes, getattr simplifie la carte d'une requête web de l'URL à la fonction qui va gérer. Si vous regardez sous le capot de Pylônes de routage, par exemple, vous verrez que (par défaut, au moins), il côtelettes d'une demande de l'URL, comme:

http://www.example.com/customers/list

dans "clients" et "liste". Ensuite, il recherche un contrôleur de classe nommée CustomerController. S'il trouve la classe, il crée une instance de la classe et puis les utilisations getattr pour obtenir son list méthode. Il appelle ensuite la méthode, en lui transmettant la demande comme un argument.

Une fois que vous comprendre cette idée, il devient très facile d'étendre les fonctionnalités d'une application web: il suffit d'ajouter de nouvelles méthodes pour les classes de contrôleur, puis de créer des liens dans vos pages qui utilisent l'Url de ces méthodes. Tout cela est rendu possible par getattr.

16voto

Josh Purvis Points 1189

Voici un exemple rapide et sale de la façon dont une classe pouvait tirer des différentes versions d’un enregistrement selon le système d’exploitation il est en cours d’exécution sur l’utilisation de méthode `` .

Maintenant nous allons utiliser cette classe dans un exemple :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X