2012-09-27 6 views
7

Ich kann nicht verstehen, was den unten Vorrang bedeutet, hat in Zusammenhang mit __getattribute__() spezieller Methode und DescriptorsDescriptors: precendence von Attribut-Zugriff über __getattribute() __

Ich lesen diese unter den topic("Precedence") - under topic ("Desriptors") aus Buch Core Python Programming 3-mal, noch kann nicht durchkommen .. Kann irgendjemand erklären, wovor diese Präzedenzfälle stehen und wo sie verwendet werden?

  • Klassen-Attribute
  • Daten Deskriptoren
  • Instanz Attribute
  • Nicht-Daten-Deskriptoren
  • Säumigen zu __getattr__()

Ich las auch die python documentation, wo ich die unten Erklärung gefunden: -

Bei Bindings hängt die Priorität des Deskriptoraufrufs davon ab, welche Deskriptormethoden definiert sind. Ein Deskriptor kann irgendeine Kombination von __get__(), __set__() und __delete__() definieren. Wenn __get__() nicht definiert ist, wird beim Zugriff auf das Attribut das Deskriptorobjekt zurückgegeben, sofern kein Wert im Instanzwörterbuch des Objekts vorhanden ist. Wenn der Deskriptor __set__() und/oder __delete__() definiert, ist es ein Datendeskriptor; Wenn es keine definiert, ist es ein Nicht-Datendeskriptor. Normalerweise definieren Datendeskriptoren sowohl __get__() als auch __set__(), während Nicht-Datendeskriptoren nur die __get__() Methode haben.

Datendeskriptoren mit **__set__()** und **__get__()** definiert immer überschreiben eine Neudefinition in einem Instanzwörterbuch. Im Gegensatz dazu können Nicht-Daten Deskriptoren von Instanzen überschrieben werden.

Python-Methoden (einschließlich staticmethod() und classmethod()) sind implementiert als Nicht-Datendeskriptoren. Dementsprechend können Instanzen Methoden neu definieren und überschreiben. Dadurch können einzelne Instanzen Verhaltensweisen erfassen, die sich von anderen Instanzen derselben Klasse unterscheiden.

Kann jemand ein kleines Beispiel geben, um zu erklären, worum es bei der first paragraph geht? Auch was bedeutet es - override a redefinition in an instance dictionary ??

+0

Related: [Welche Python-Sprachregel erlaubt den Deskriptor zuerst zu finden?] (Http://stackoverflow.com/questions/1865902/), [Deskriptoren und Python-bereitgestellten Attribute] (http://stackoverflow.com/questions/10536539 /) –

+0

@PiotrDobrogost .. Danke Piotr für diese Links .. :) –

Antwort

4

Angenommen, Sie haben eine Klasse:

class C(object): 
    dd = MyDataDescriptor() 
    ndd = MyNonDataDescriptor() 
    def __init__(self): 
     self.__value = 1 

erste auf Daten-Deskriptoren aussehen lassen. Wenn in Ihrem Code Sie tun:

cobj = C() 
cobj.dd 

entsprechend dem vorstehenden Absatz, die cobj.__dict__ Objekt wird immer außer Kraft gesetzt, wenn das dd Attribut zugegriffen wird, dh __get__/__set__/__del__ Methoden des Deskriptors Objekt wird immer statt die verwendet werden, Wörterbuch.Die einzige Ausnahme tritt auf, wenn das Deskriptorobjekt keine -Methode definiert. Dann, wenn es einen dd Schlüssel im cobj.__dict__ Objekt gibt, wird sein Wert gelesen, wenn nicht das Deskriptorobjekt selbst zurückgegeben wird.

Jetzt für die Nicht-Daten-Deskriptoren. Wenn in Ihrem Code, den Sie anrufen:

cobj.ndd = 2 

dann die cobj.__dict__versteckt der Nicht-Daten-Descriptor und das ndd Attribut wird immer vom cobj.__dict__ Objekt gelesen. Also, wenn Sie tun:

cobj.ndd 

die __get__ Methode des Deskriptors wird nicht genannt. Aber wenn Sie das Attribut aus dem Wörterbuch löschen:

del cobj.ndd 

dann ist der Deskriptor zurück, so

Aufruf
cobj.ndd 

die __get__ Methode auf dem Descriptor nennen.

+0

Vielen Dank Vicent, für so eine schöne und ausführliche Erklärung .. Alle meine Zweifel sind jetzt klar .. Vielen Dank nochmal :) –