Verwirrt mit getattribute und setattribute in Python

8

Ich möchte wissen, dass wenn ich eine Klasse wie diese habe

%Vor%
  

obj = Test ()

Wenn ich obj.a mache, was heißt dann zuerst?

__getattr__ oder getattr oder Suche in __dict__['a']

und gleiches mit setattr

Laut Dokumentation

%Vor%

Es heißt nicht an den üblichen Orten gefunden. Was ist das für übliche Orte? Ich möchte wissen, wann es heißt

auch was ist das diff mit dieser object.__getattribute__(self, name)¶

Kann mir jemand Beispiele geben wo alle benutzt werden

    
user196264097 09.02.2013, 10:50
quelle

4 Antworten

29
___ qstntxt ___

Ich möchte wissen, dass wenn ich eine Klasse wie diese habe

%Vor%
  

obj = Test ()

Wenn ich __getattribute__ mache, was heißt dann zuerst?

object.__getattribute__ oder __dict__ oder Suche in property

und gleiches mit setattr

Laut Dokumentation

%Vor%

Es heißt nicht an den üblichen Orten gefunden. Was ist das für übliche Orte? Ich möchte wissen, wann es heißt

auch was ist das diff mit dieser myAttr

Kann mir jemand Beispiele geben wo alle benutzt werden

    
___ answer14787509 ___

Von den Dokumenten :

  

... Zum Beispiel sucht obj.d d in   das Wörterbuch von obj. Wenn d die Methode __get__ definiert, dann    __set__ wird gemäß den aufgeführten Präzedenzregeln aufgerufen   unten.

     

...   Für Objekte ist die Maschine in%   transformiert property in __dict__ . Das   Die Implementierung funktioniert über eine Prioritätskette, die Daten bereitstellt   Deskriptoren Priorität über Instanzvariablen, Instanzvariablen   Priorität gegenüber Nicht-Datendeskriptoren und weist die niedrigste Priorität zu    object.__getattribute__ falls angegeben.

Das heißt, __get__ ruft __dict__ auf, das standardmäßig __dict__ verwendet. __get__ wird als letztes Mittel aufgerufen. Der Rest beschreibt Deskriptoren, z. B. __set__ oder gewöhnliches Methodenverhalten.

  

Wie kann __get__ die Methode __getattr__

definieren?
%Vor%     
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer14787505 ___

Das Namespace-Wörterbuch ( __getattr__ ) wird zuerst aufgerufen.

Aus der property :

  

Eine Klasseninstanz hat einen Namensraum, der als ein Wörterbuch implementiert ist   der erste Ort, an dem Attributverweise gesucht werden. Wenn ein   Attribut wird dort nicht gefunden, und die Klasse der Instanz hat eine   Nach diesem Attribut wird die Suche mit den Klassenattributen fortgesetzt   Wenn kein Klassenattribut gefunden wird und die Klasse des Objekts a    __getattribute__ Methode, die aufgerufen wird, um die Suche zu erfüllen.

Dokumente auf %code% :

  

Wird unbedingt aufgerufen, um Attributzugriffe für Instanzen zu implementieren   der Klasse. Wenn die Klasse auch %code% definiert, wird dies der Fall sein   nicht aufgerufen werden, es sei denn %code% ruft es explizit oder auf   Erhöht %code% . Diese Methode sollte das (berechnete) zurückgeben   Attributwert oder eine %code% Ausnahme auslösen.

Dokumente auf %code% :

  

Wenn das Attribut über den normalen Mechanismus gefunden wird, %code%   wird nicht aufgerufen.

    
___ qstnhdr ___ Verwirrt mit getattribute und setattribute in Python ___ answer14787604 ___
%Vor%

Keine der oben genannten wird aufgerufen ..

%Vor%

Sie möchten vielleicht Folgendes prüfen: Ссылка Wahrscheinlich müssen Sie eine verschachtelte Klasse implementieren, die die Funktionen der Nummernklasse verarbeitet, um Anrufe wie im Beispiel zu erfassen. Oder zumindest ist das ein Weg, es zu tun.

Der ganzzahlige Wert enthält die folgenden Funktionen, die Sie abfangen müssen

%Vor%     
___
Blckknght 09.02.2013, 11:15
quelle
1
%Vor%

Keine der oben genannten wird aufgerufen ..

%Vor%

Sie möchten vielleicht Folgendes prüfen: Ссылка Wahrscheinlich müssen Sie eine verschachtelte Klasse implementieren, die die Funktionen der Nummernklasse verarbeitet, um Anrufe wie im Beispiel zu erfassen. Oder zumindest ist das ein Weg, es zu tun.

Der ganzzahlige Wert enthält die folgenden Funktionen, die Sie abfangen müssen

%Vor%     
Torxed 09.02.2013 11:25
quelle
0

Von den Dokumenten :

  

... Zum Beispiel sucht obj.d d in   das Wörterbuch von obj. Wenn d die Methode __get__() definiert, dann    d.__get__(obj) wird gemäß den aufgeführten Präzedenzregeln aufgerufen   unten.

     

...   Für Objekte ist die Maschine in%   transformiert object.__getattribute__() in b.x . Das   Die Implementierung funktioniert über eine Prioritätskette, die Daten bereitstellt   Deskriptoren Priorität über Instanzvariablen, Instanzvariablen   Priorität gegenüber Nicht-Datendeskriptoren und weist die niedrigste Priorität zu    type(b).__dict__['x'].__get__(b, type(b)) falls angegeben.

Das heißt, __getattr__() ruft obj.a auf, das standardmäßig __getattribute__() verwendet. __dict__ wird als letztes Mittel aufgerufen. Der Rest beschreibt Deskriptoren, z. B. __getattr__() oder gewöhnliches Methodenverhalten.

  

Wie kann property die Methode d

definieren?
%Vor%     
jfs 09.02.2013 11:13
quelle
0

Das Namespace-Wörterbuch ( __dict__ ) wird zuerst aufgerufen.

Aus der docs :

  

Eine Klasseninstanz hat einen Namensraum, der als ein Wörterbuch implementiert ist   der erste Ort, an dem Attributverweise gesucht werden. Wenn ein   Attribut wird dort nicht gefunden, und die Klasse der Instanz hat eine   Nach diesem Attribut wird die Suche mit den Klassenattributen fortgesetzt   Wenn kein Klassenattribut gefunden wird und die Klasse des Objekts a    __getattr__() Methode, die aufgerufen wird, um die Suche zu erfüllen.

Dokumente auf object.__getattribute__ :

  

Wird unbedingt aufgerufen, um Attributzugriffe für Instanzen zu implementieren   der Klasse. Wenn die Klasse auch __getattr__() definiert, wird dies der Fall sein   nicht aufgerufen werden, es sei denn __getattribute__() ruft es explizit oder auf   Erhöht AttributeError . Diese Methode sollte das (berechnete) zurückgeben   Attributwert oder eine AttributeError Ausnahme auslösen.

Dokumente auf object.__getattr__(self, name) :

  

Wenn das Attribut über den normalen Mechanismus gefunden wird, __getattr__()   wird nicht aufgerufen.

    
Ashwini Chaudhary 09.02.2013 11:13
quelle

Tags und Links