Qu'est-ce que getattr() exactement et comment puis-je l'utiliser?
J'ai été la lecture sur le getattr()
function. 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()
est que getattr(li, "pop")
est le même que l'appel à la li.pop
.
Je n'ai pas compris 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?
- Quelle partie vous avez des problèmes avec? Les attributs comme des chaînes de caractères? La première des fonctions de classe?
- Je pense que mon problème est de comprendre le concept de getattr(). Je ne comprends toujours pas son but.
- n'est pas de ma réponse, rendre les choses plus claires ?
- votre réponse définitivement effacé certains de mes doutes, mais je n'arrive pas à bien comprendre ce que getattr() est pour.
- Je l'ai fait. La documentation n'avait que la définition donc, j'ai été un peu confus au sujet de son utilisation. Je comprends getattr maintenant, après la lecture de plus à ce sujet.
- Voir aussi: stackoverflow.com/questions/786412/...
Vous devez vous connecter pour publier un commentaire.
getattr(object, 'x')
est complètement équivalent àobject.x
.Il y a les deux cas seulement où
getattr
peut être utile.object.x
, parce que vous ne savez pas à l'avance de l'attribut que vous souhaitez (il s'agit d'une chaîne de caractères). très utile pour la méta-programmation.object.y
déclenche uneAttributeError
si il n'y a pasy
. Maisgetattr(object, 'y', 5)
sera de retour5
.Objets en Python peuvent avoir des attributs -- données d'attributs et de fonctions pour travailler avec ceux (les méthodes). En fait, chaque objet a intégré dans les attributs.
Par exemple, vous avez un objet
person
, qui possède plusieurs attributs:name
,gender
, etc.Vous accéder à ces attributs (que ce soit des 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 appelée
attr_name
.si
alors, au lieu d'écrire
vous pouvez écrire
Un peu de pratique:
getattr
va augmenterAttributeError
si l'attribut avec le nom donné n'existe pas dans l'objet:Mais vous pouvez passer une valeur par défaut en tant que troisième argument, qui sera restituée si tel attribut n'existe pas:
Vous pouvez utiliser
getattr
avecdir
pour itérer sur tous les noms d'attribut et d'obtenir leurs valeurs:Une utilisation pratique pour ce serait de trouver toutes les méthodes dont le nom commence par
test
et appeler.Similaire à
getattr
il estsetattr
qui vous permet de définir un attribut d'un objet ayant son nom:getattr(..)
doit être utilisé dans les 2 scénarios: 1. lorsque le nom de l'attribut est une valeur à l'intérieur d'une variable (par exemple,getattr(person, some_attr)
) et 2. lorsque nous avons besoin d'utiliser la troisième position argument pour la valeur par défaut (par exemple,getattr(person, 'age', 24)
). Si je vois un scénario commegetattr(person, 'age')
il me semble que c'est identique àperson.age
qui m'amène à penser queperson.age
est plus Pythonic. Est-ce exact?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 cela:
parce que x n'est pas du type
builtin
, maisstr
. Cependant, vous POUVEZ faire ceci: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 des modules.
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
fait, il est aisé de carte 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:en "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, puis utilisegetattr
pour obtenir sonlist
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
.Voici un rapide exemple de la façon dont une classe pouvait tirer de différentes versions d'une méthode d'enregistrement selon le système d'exploitation il est exécuté sur l'utilisation de
getattr()
.Maintenant, nous allons utiliser cette classe dans un exemple:
À l'exclusion de tous les étonnantes réponses ici, il y a un moyen d'utiliser
getattr
pour enregistrer copieux lignes de code et de le garder bien en place. Cette pensée m'est venue à la suite de la terrible représentation de code qui pourrait parfois être une nécessité.Scénario
Supposons que votre structure de répertoire est comme suit:
Et, vous avez des fonctions pour obtenir des informations sur
Thor
,Iron Man
,Doctor Strange
danssuperheroes.py
. Vous très intelligemment écrire les propriétés de chacun d'eux dansproperties.py
dans un compactdict
, puis d'y accéder.properties.py
Maintenant, disons que vous voulez retourner les capacités de chacun d'eux sur la demande dans
superheroes.py
. Donc, il y a des fonctions comme...et bien d'autres fonctions retournant des valeurs différentes sur les touches et les super-héros.
Avec l'aide de
getattr
, vous pourriez faire quelque chose comme:Vous considérablement réduit le nombre de lignes de code, les fonctions de répétition et de!
Oh, et bien sûr, si vous avez de mauvais noms comme
properties_of_thor
pour les variables , ils peuvent être réalisés et accessible simplement en faisantREMARQUE: Pour ce problème particulier, il peut y avoir des moyens plus intelligents pour faire face à la situation, mais l'idée est de donner un aperçu sur l'utilisation de
getattr
dans les bons endroits pour écrire nettoyeur de code.J'utilise parfois
getattr(..)
paresseusement initialiser les attributs d'une importance secondaire, juste avant qu'ils sont utilisés dans le code.Comparer les suivantes:
À ceci:
L'avantage de la seconde manière, c'est que
n_calls_to_plot
n'apparaît autour de l'endroit dans le code où il est utilisé. C'est bon pour des raisons de lisibilité, parce que (1) vous pouvez immédiatement voir de quelle valeur il commence avec lors de la lecture de comment il est utilisé, (2) il n'a pas d'introduire une distraction dans le__init__(..)
méthode, qui devraient idéalement être à propos de l'état conceptuel de la classe, plutôt que d'une certaine utilité compteur qui n'est utilisé que par un seul de la fonction de méthodes pour des raisons techniques, tels que l'optimisation, et n'a rien à voir avec le sens de l'objet.Assez souvent quand je suis en création d'un fichier XML à partir de données stockées dans une classe, je voudrais recevoir fréquemment des erreurs si l'attribut n'existe pas ou a été de type
None
. Dans ce cas, ma question n'était pas de ne pas savoir ce que le nom de l'attribut a été, comme indiqué dans votre question, mais plutôt de données stockée dans cet attribut.Si j'ai utilisé
hasattr
pour ce faire, il serait de retourTrue
même si la valeur de l'attribut est de typeNone
et ce serait la cause de mon ElementTreeset
de commande à l'échec.Si la valeur de l'attribut est de type
None
,getattr
serait également de retour lui qui serait la cause de mon ElementTreeset
de commande à l'échec.- Je utiliser la méthode suivante pour prendre soin de ces cas maintenant:
C'est quand et comment j'utilise
getattr
.Une autre utilisation de getattr() dans la mise en œuvre d'une instruction switch en Python. Il utilise à la fois la réflexion pour obtenir le type de cas.
C'est aussi la clarification de https://www.programiz.com/python-programming/methods/built-in/getattr
L'âge: 23
L'âge: 23
Le sexe est: Masculin
AttributeError: 'Personne' objet n'a pas d'attribut de 'sexe'