Welche speziellen Methoden umgehen __getattribute__ in Python?

8
  

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?

    
porgarmingduod 13.10.2012, 11:33
quelle

2 Antworten

4

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 .

    
Bakuriu 25.10.2012, 07:36
quelle
1

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:

%Vor%

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.

    
vlad-ardelean 05.01.2015 01:09
quelle

Tags und Links