Neben der Umgehung beliebiger Instanzattribute im Interesse der Korrektheit wird bei der impliziten Suche nach speziellen Methoden die Methode
__getattribute__()
auch für die Metaklasse des Objekts umgangen.
Die Dokumente erwähnen spezielle Methoden wie __hash__
, __repr__
und __len__
, und ich weiß aus Erfahrung, dass es auch __iter__
für Python 2.7 enthält.
Um eine Antwort auf eine verwandte Frage zu geben:
"Magic
__methods__()
werden speziell behandelt: Sie werden intern in der Typdatenstruktur" Slots "zugewiesen, um ihre Suche zu beschleunigen, und sie werden nur in diesen Slots nachgeschlagen."
Um meine Antwort auf noch besser zu machen Frage , ich muss wissen: Über welche Methoden sprechen wir konkret?
Sie finden eine Antwort in der python3 Dokumentation für object.__getattribute__
, die besagt:
Wird bedingungslos aufgerufen, um Attributzugriffe für Instanzen der Klasse zu implementieren. Wenn die Klasse auch
__getattr__()
definiert, Letzteres wird nur aufgerufen, wenn__getattribute__()
es aufruft Explizit oder löst einen AttributeError aus. Diese Methode sollte die (berechneter) Attributwert oder löst eine AttributeError-Ausnahme aus. Im Um eine unendliche Rekursion in dieser Methode zu vermeiden, wird deren Implementierung durchgeführt sollte immer die Basisklassenmethode mit demselben Namen für den Zugriff aufrufen B. das Objekt.__getattribute__(self, name)
.Hinweis
Diese Methode kann immer noch umgangen werden, wenn spezielle Methoden als Ergebnis von implizitem Aufruf über die Sprachsyntax oder integriert betrachtet werden Funktionen. Siehe Spezielle Methodensuche.
Auch diese Seite erklärt genau, wie diese "Maschinerie" funktioniert . Grundsätzlich wird __getattribute__
nur aufgerufen, wenn Sie auf ein Attribut mit dem Operator .
(Punkt) zugreifen (und auch auf hasattr
, wie Zagorulkin darauf hingewiesen hat).
Beachten Sie, dass auf der Seite nicht angegeben wird, welche speziellen Methoden implizit nachgeschlagen werden. Daher halte ich das für alle von ihnen (die Sie möglicherweise finden können hier .
Eingecheckt in 2.7.9
Es wurde keine Möglichkeit gefunden, den Aufruf von __getattribute__
mit einer der magischen Methoden zu umgehen, die in object
oder type
gefunden wurden:
Setze das am Anfang der Datei, die ich in ein richtiges Python-Modul umbenannt habe (asdf.py)
%Vor% Dann habe ich auch versucht, jeden dieser Namen nach getattr
und hasattr
- & gt; gleiches Ergebnis. __getattribute__
wurde jedes Mal aufgerufen.
Wenn also jemand andere Ideen hat ... Ich war zu faul, um in C-Code zu schauen, aber ich bin sicher, die Antwort liegt irgendwo da.
Entweder gibt es etwas, was ich nicht richtig verstehe, oder die Ärzte lügen.
Tags und Links python magic-methods