getattr
ist eine integrierte Funktion, die (mindestens) zwei Argumente übernimmt: das Objekt, von dem Sie das Attribut erhalten, und den String-Namen des Attributs.
Wenn der String Name eine Konstante ist, sagen 'foo'
, getattr(obj, 'foo')
ist genau das Gleiche wieobj.foo
.
Der Hauptanwendungsfall für die integrierte Funktion getattr
ist also, wenn Sie den Attributnamen nicht als Konstante haben, sondern als Variable. Ein zweiter wichtiger Anwendungsfall ist, wenn Sie drei Argumente übergeben und nicht nur zwei: Wenn das Attribut in dem Objekt nicht vorhanden ist, gibt getattr
das dritte Argument "default" zurück, anstatt eine Ausnahme auszulösen.
__getattr__
ist eine spezielle Methode, die in einer Klasse definiert ist, die aufgerufen wird, wenn ein Attribut einer Instanz dieser Klasse angefordert wird, und andere normale Möglichkeiten zur Bereitstellung dieses Attributs (über die Instanz __dict__
, Slots, Eigenschaften und so) on) alles gescheitert. Sie können es beispielsweise definieren, wenn Sie andernfalls nicht definierte Attributsuchvorgänge an andere Objekte delegieren möchten.
Also Ihr zweites Beispiel ist falsch, weil die eingebaute getattr
nie mit einem einzigen Argument aufgerufen werden kann.
Die dritte schlägt fehl, weil das Wörterbuch, das Sie versuchen, "ein Attribut zu erhalten", dieses Attribut nicht hat - es hat Elemente, die von Attributen natürlich völlig getrennt sind.
mögliches Duplikat von [Verständnis des Unterschieds zwischen \ _ \ _ getattr \ _ \ _ und \ _ \ _ getattribute \ _ \ _] (http://stackoverflow.com/questions/4295678/understanding-the-difference-between- getattr-and-getattribute) – Trilarion
@Trilarion das ist kein richtiges Duplikat für diese Frage –