Verwechseln mit getattribute und setattribute in python
Ich will wissen, dass, wenn ich die Klasse wie folgt aus
class Test(object):
def __init__(self):
self.a = 20
self.b = 30
obj = Test()
Wenn ich obj.a
, dann die zuerst angerufen?
__getattr__
oder getattr
oder lookup in __dict__['a']
und gleichzeitig mit setattr
Laut Python 2.7 docs:
Objekt.__getattr__(selbst, Namen)
Aufgerufen, wenn ein Attribut-lookup nicht gefunden hat das Attribut in den üblichen stellen (d.h. es wird keine Instanz-Attribut, noch ist es in der Klasse Baum für sich selbst). name ist der name des Attributs. Diese Methode sollte den (berechneten) Attribut-Wert erhöhen oder eine AttributeError-Ausnahme.
Heißt es nicht gefunden in den üblichen Orten. was ist, dass die üblichen Orte. Ich möchte wissen, Wann es aufgerufen wird
auch, was ist das diff mit diesem object.__getattribute__(self, name)
Kann mir jemand Beispiel, wo alle genutzt werden
- Ich kann nicht verstehen, die Frage.
- Keine der 3 Optionen bestehen. Meinst du
__getattribute__('a')
,__getattr__('a')
, und__dict__['a']
- Eric du hast Recht
- Wenn Sie wissen möchten, welche der drei wird zuerst aufgerufen? Sie sind nicht alle genannt IIRC gleichzeitig in einem Aufruf, nennt man Sie unter verschiedenen circomstances.. sehen Sie mehr auf docs.python.org/2/reference/datamodel.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein bisschen kompliziert. Hier ist die Abfolge der Prüfungen Python macht wenn Sie eine Anfrage ein Attribut eines Objekts.
Erste, Python wird prüfen, ob das Objekt s-Klasse hat eine
__getattribute__
Methode. Wenn es nicht definiert ist, erbtobject.__getattribute__
die sich um die anderen Möglichkeiten zu finden, die Attributwerte.Die nächste Prüfung ist in der Objekt-Klasse
__dict__
. Aber selbst wenn ein Wert gefunden wird, ist es, es kann nicht sein, das Ergebnis der Attribut-lookup! Nur "Daten-Deskriptoren" Vorrang wenn, finden Sie hier. Die häufigsten Datenbeschreibung ist eineproperty
Objekt, welches ein wrapper um eine Funktion, die aufgerufen wird, jedes mal, wenn ein Attribut zugegriffen wird. Sie können erstellen Sie eine Eigenschaft mit einem decorator:In dieser Klasse
myAttr
ist eine Datenbeschreibung. Das bedeutet einfach, dass es implementiert die Deskriptor-Protokoll, indem beide__get__
und__set__
Methoden. Einproperty
ist eine Datenbeschreibung.Wenn die Klasse nicht alles in seiner
__dict__
mit der bitte den Namen,object.__getattribute__
sucht durch seine Basis-Klassen (nach der MRO) zu sehen, wenn man übernommen wird. Eine vererbte Datenbeschreibung funktioniert genau so, wie man in der Klasse des Objekts.Wenn eine Daten-Deskriptor gefunden, es ist
__get__
- Methode aufgerufen und der Rückgabewert wird der Wert der Attribut-lookup. Wenn ein Objekt, das keine Daten-Deskriptor gefunden, es ist hielt für einen moment, aber nicht zurück nur noch.Nächsten, das Objekt der eigenen
__dict__
geprüft wird für das Attribut. Dies ist, wo die meisten normal-member-Variablen gefunden werden.Wenn das Objekt
__dict__
gar nichts, aber je früher die Suche über die Klasse (oder Basisklassen) gefunden, die etwas anderes als eine Daten-Deskriptor, es nimmt weiter Vorrang. Eine normale class-variable werden einfach zurückgegeben, aber "non-data descriptors" wird ein wenig mehr verarbeiten.Einer nicht-Daten-Deskriptor ist ein Objekt mit einer
__get__
Methode, aber keine__set__
Methode. Die häufigsten Arten von nicht-Daten-Deskriptoren sind Funktionen, die gebunden werden Methoden wenn auf Sie zugegriffen wird, als eine nicht-Daten-Deskriptor von einem Objekt (dies ist, wie Python passieren kann das Objekt als erstes argument automatisch). Der Deskriptor ist__get__
Methode aufgerufen wird, und es ist Wert das Ergebnis der Attribut-lookup.Schließlich, wenn keine der vorherigen Prüfungen gelang es, die
__getattr__
wird aufgerufen, falls er vorhanden ist.Hier sind einige Klassen mit stetig wachsender Priorität-Attribut-Zugriff Mechanismen zu überschreiben das Verhalten der übergeordneten Klasse:
Und eine demonstration der Klassen in Aktion:
O1 (
__getattr__
):O2 (Klasse Variablen und non-data-descriptors):
O3 (Instanz-Variablen, darunter ein lokal überschriebenen Methode):
O4 (Daten-Deskriptoren, mit der
property
decorator):O5 (
__getattribute__
):Print "function name" rasie AttributeError
mit jeder Funktion, so dass ich sehen kann, die Kette von EreignissenGetattribute
zuerst, dann dringt es ingetattr
und dann Fehler auslösen. warum ich nicht ging, tnto__dict
__setattr__
?__setattr__
Methode existiert in der Klasse. Wenn es tut, ist es immer genannt. Wenn nicht, ist der zweite Schritt ist zu prüfen, ob das Attribut beschreibt eine Daten-Deskriptor in der Klasse (oder einer geerbten Basisklasse). Wenn ein Daten-Deskriptor gefunden, seine__set__
- Methode aufgerufen wird. Non-data descriptors und anderen Klasse-Variablen ignoriert werden (Sie werden beschattet). Wenn keiner der vorherigen Fälle waren Treffer, der Wert wird einfach zugewiesen in der Instanz__dict__
.Keiner der oben genannten..
Würden Sie Aussehen könnte, in: http://docs.python.org/2/library/numbers.html#numbers.Number
Höchstwahrscheinlich werden Sie brauchen, um zu implementieren eine geschachtelte Klasse, die Griffe der Zahl-class-Funktionen, um zu entreißen-up-Anrufe, wie in dem Beispiel. Oder, mindestens, das ist ein Weg, es zu tun..
Der integer-Wert enthält die folgenden Funktionen, die Sie haben, um Sie abzufangen
object
, oder Sie bekommen einen old-style Klasse, die nicht die__getattribute__
Methode (oder Deskriptoren, und viele andere komplizierte bits von Python-Daten-Modell).Object
und dannraise AttributeError
dann bekomme ich dieseGetattribute: a GetAttr: a None
. wie kann ich andere Kette-Methoden. Ich war letzten getattr.None
Ausgabe. Müssen Sie abfangen__setitem__
etc wie gut und behalten Sie den überblick irgendwie, auf welche Werte gesetzt sind, und gibt Sie entsprechend an 🙂Vom die docs:
Dass
obj.a
Anrufe__getattribute__()
dass standardmäßig verwendet__dict__
.__getattr__()
genannt wird wie der Letzte. Der rest beschreibt Deskriptoren z.B.property
oder gewöhnlichen Methoden Verhalten.d
definieren Sie die Methode__get__()
. kann Sie Beispiel geben__get__
Methode. Auch Torex ist zu sagen, dass nichts ist genannt. Ist er im Recht. Können Sie mir examlike wie torx-wo sehe ich alle print-Anweisung, so dass ich sehen kann, die Kette der aufrufenden Methodenobject
's Unterklasse). Die Doku zeigt pure Pythonproperty
Umsetzung, wo Sie sehen können, wie__get__()
definiert werden könnten. Sie brauchen nicht zu wissen, über Deskriptoren zu verstehen, ein einfaches Attribut zugreifen, als in deiner Frage.Getattribute
zuerst, dann dringt es ingetattr
und dann Fehler auslösen. warum ich nicht ging, tnto__dict
eineDen namespace-Wörterbuch(
__dict__
) wird zuerst angerufen.Aus der
docs
:Docs auf
- Objekt.__getattribute__
:Docs auf
- Objekt.__getattr__(self, name)
:If the attribute is found through the normal mechanism
was ist das normal-Mechanismus__getattribute__
ist der normale Mechanismus. Lesen Sie die Dokumentation.