Ich habe kürzlich über die getattr()
Funktion gelesen . Das Problem ist, dass ich die Idee seiner Verwendung immer noch nicht verstehen kann. Das einzige, was ich verstehe, getattr()
ist, dass getattr(li, "pop")
es dasselbe ist wie anrufen li.pop
.
Ich habe nicht verstanden, wann in dem Buch erwähnt wurde, wie Sie damit einen Verweis auf eine Funktion erhalten, ohne deren Namen bis zur Laufzeit zu kennen. Vielleicht bin ich im Allgemeinen ein Noob in der Programmierung. Könnte jemand etwas Licht in das Thema bringen? Wann und wie verwende ich das genau?
Antworten:
getattr(object, 'x')
ist völlig gleichbedeutend mitobject.x
.Es gibt nur zwei Fälle, in denen
getattr
dies nützlich sein kann.object.x
, weil Sie nicht im Voraus wissen, welches Attribut Sie möchten (es stammt aus einer Zeichenfolge). Sehr nützlich für die Metaprogrammierung.object.y
wird eine erhöhen,AttributeError
wenn es keine gibty
. Abergetattr(object, 'y', 5)
ich werde wiederkommen5
.quelle
Objekte in Python können Attribute haben - Datenattribute und Funktionen, um mit diesen (Methoden) zu arbeiten. Tatsächlich verfügt jedes Objekt über integrierte Attribute.
Zum Beispiel können Sie ein Objekt haben
person
, hat , dass mehrere Attribute:name
,gender
usw.Der Zugriff auf diese Attribute (es Methoden oder Datenobjekte sein) in der Regel zu schreiben:
person.name
,person.gender
,person.the_method()
etc.Aber was ist, wenn Sie den Namen des Attributs zum Zeitpunkt des Schreibens des Programms nicht kennen? Beispielsweise haben Sie den Namen des Attributs in einer Variablen namens gespeichert
attr_name
.wenn
dann anstatt zu schreiben
Du kannst schreiben
Einige Übungen:
getattr
wird ausgelöst,AttributeError
wenn das Attribut mit dem angegebenen Namen im Objekt nicht vorhanden ist:Sie können jedoch einen Standardwert als drittes Argument übergeben, der zurückgegeben wird, wenn ein solches Attribut nicht vorhanden ist:
Sie können
getattr
zusammen mit verwendendir
, um alle Attributnamen zu durchlaufen und ihre Werte abzurufen:Eine praktische Anwendung hierfür wäre, alle Methoden zu finden, deren Namen mit beginnen,
test
und sie aufzurufen .Ähnlich wie
getattr
dortsetattr
können Sie ein Attribut eines Objekts mit seinem Namen festlegen:quelle
getattr(..)
dies in zwei Szenarien verwendet werden sollte: 1. wenn der Attributname ein Wert innerhalb einer Variablen ist (z. B.getattr(person, some_attr)
) und 2. wenn wir das dritte Positionsargument für den Standardwert verwenden müssen (zgetattr(person, 'age', 24)
. B. ). Wenn ich ein Szenario wiegetattr(person, 'age')
dieses sehe , scheint es mir identisch zu sein,person.age
was mich zu derperson.age
Annahme veranlasst, dass es mehr pythonisch ist. Ist das korrekt?Für mich
getattr
ist es am einfachsten, dies folgendermaßen zu erklären:Sie können Methoden basierend auf dem Inhalt einer Zeichenfolge aufrufen, anstatt den Methodennamen einzugeben.
Zum Beispiel können Sie dies nicht tun:
weil x nicht vom Typ ist
builtin
, aberstr
. Sie können dies jedoch tun:Sie können sich basierend auf Ihrer Eingabe dynamisch mit Objekten verbinden. Ich fand es nützlich, wenn es um benutzerdefinierte Objekte und Module geht.
quelle
Ein ziemlich häufiger Anwendungsfall
getattr
ist das Zuordnen von Daten zu Funktionen.In einem Webframework wie Django oder Pylons
getattr
ist es beispielsweise einfach, die URL einer Webanforderung der Funktion zuzuordnen, die sie verarbeiten wird. Wenn Sie beispielsweise unter die Haube des Routings von Pylons schauen, werden Sie feststellen, dass (zumindest standardmäßig) die URL einer Anfrage zerlegt wird, wie z.in "Kunden" und "Liste". Dann wird nach einer Controller-Klasse mit dem Namen gesucht
CustomerController
. Angenommen, es findet die Klasse, erstellt es eine Instanz der Klasse und verwendet sie danngetattr
, um ihre zu erhaltenlist
Methode abzurufen. Diese Methode wird dann aufgerufen und die Anforderung als Argument übergeben.Sobald Sie diese Idee verstanden haben, können Sie die Funktionalität einer Webanwendung ganz einfach erweitern: Fügen Sie den Controller-Klassen einfach neue Methoden hinzu und erstellen Sie dann auf Ihren Seiten Links, die die entsprechenden URLs für diese Methoden verwenden. All dies wird ermöglicht durch
getattr
.quelle
Hier ist ein kurzes und schmutziges Beispiel dafür, wie eine Klasse verschiedene Versionen einer Speichermethode auslösen kann, je nachdem, auf welchem Betriebssystem sie ausgeführt wird
getattr()
.Verwenden wir diese Klasse nun in einem Beispiel:
quelle
Abgesehen von all den erstaunlichen Antworten hier gibt es eine Möglichkeit, sie zu verwenden
getattr
zahlreiche Codezeilen zu speichern und festzuhalten. Dieser Gedanke folgte der schrecklichen Darstellung von Code, die manchmal eine Notwendigkeit sein könnte.Szenario
Angenommen, Ihre Verzeichnisstruktur lautet wie folgt:
Und, haben Sie Funktionen für den Zugriff auf Informationen über
Thor
,Iron Man
,Doctor Strange
insuperheroes.py
. Sie schreiben die Eigenschaften aller sehr intelligentproperties.py
in einem Kompakt aufdict
und greifen dann darauf zu.properties.py
Angenommen, Sie möchten die Funktionen der einzelnen Funktionen bei Bedarf in zurückgeben
superheroes.py
. Es gibt also Funktionen wie... und weitere Funktionen, die basierend auf den Tasten und dem Superhelden unterschiedliche Werte zurückgeben.
Mit Hilfe von
getattr
können Sie Folgendes tun:Sie haben die Anzahl der Codezeilen, Funktionen und Wiederholungen erheblich reduziert!
Oh und natürlich, wenn Sie schlechte Namen wie
properties_of_thor
für Variablen haben, können diese durch einfaches Ausführen erstellt und aufgerufen werdenHINWEIS: Für dieses spezielle Problem kann es intelligentere Möglichkeiten geben, mit der Situation umzugehen. Die Idee ist jedoch, einen Einblick in die Verwendung
getattr
an den richtigen Stellen zum Schreiben von sauberem Code zu geben.quelle
quelle
Ich verwende es manchmal
getattr(..)
, Attribute von sekundärer Bedeutung träge zu initialisieren, kurz bevor sie im Code verwendet werden.Vergleichen Sie Folgendes:
Dazu:
Der Vorteil des zweiten Weges besteht darin, dass er
n_calls_to_plot
nur an der Stelle im Code angezeigt wird, an der er verwendet wird. Dies ist gut für die Lesbarkeit, da (1) Sie sofort sehen können, mit welchem Wert es beginnt, wenn Sie lesen, wie es verwendet wird, (2) es keine Ablenkung in die__init__(..)
Methode einführt , die idealerweise den konzeptuellen Zustand der Klasse betreffen sollte anstelle eines Dienstprogrammzählers, der nur von einer der Methoden der Funktion aus technischen Gründen wie der Optimierung verwendet wird und nichts mit der Bedeutung des Objekts zu tun hat.quelle
Sehr häufig, wenn ich eine XML-Datei aus Daten erstelle, die in einer Klasse gespeichert sind, erhalte ich häufig Fehler, wenn das Attribut nicht vorhanden oder vom Typ war
None
. In diesem Fall wusste mein Problem nicht, wie der Attributname laut Ihrer Frage lautete, sondern es wurden Daten jemals in diesem Attribut gespeichert.Wenn ich dies früher
hasattr
getan hätte, würde es zurückgegeben,True
selbst wenn der Attributwert vom Typ wäre,None
und dies würde dazu führen, dass mein ElementTree-set
Befehl fehlschlägt.Wenn der Attributwert vom Typ wäre
None
,getattr
würde er auch zurückgegeben, was dazu führen würde, dass mein ElementTree-set
Befehl fehlschlägt.Ich benutze jetzt die folgende Methode, um diese Fälle zu behandeln:
Dies ist, wann und wie ich benutze
getattr
.quelle
Eine andere Verwendung von getattr () beim Implementieren einer switch-Anweisung in Python. Es verwendet beide Reflexionen, um den Falltyp zu erhalten.
quelle
setattr ()
Wir verwenden setattr , um unserer Klasseninstanz ein Attribut hinzuzufügen. Wir übergeben die Klasseninstanz, den Attributnamen und den Wert.
getattr ()
Mit getattr rufen wir diese Werte ab
Beispielsweise
quelle
Ich denke, dieses Beispiel ist selbsterklärend. Es wird die Methode des ersten Parameters ausgeführt, dessen Name im zweiten Parameter angegeben ist.
quelle
Dies wird auch unter https://www.programiz.com/python-programming/methods/built-in/getattr erläutert
Das Alter ist: 23
Das Alter ist: 23
Das Geschlecht ist: männlich
AttributeError: Das Objekt 'Person' hat kein Attribut 'Geschlecht'.
quelle
Ich habe es in Python2.7.17 versucht
Einige der Kollegen haben bereits geantwortet. Ich habe jedoch versucht, getattr (obj, 'set_value') aufzurufen, und dies hat die set_value-Methode nicht ausgeführt. Also habe ich zu getattr (obj, 'set_value') () geändert -> - Dies hilft, dasselbe aufzurufen.
Beispielcode:
Beispiel 1:
quelle