2015-12-31 11 views
5

Ich verstehe, dass in Python, wann immer Sie auf eine Klasse/Instanz-Variable zugreifen, ruft __getattribute__ Methode, um das Ergebnis zu erhalten. Jedoch kann ich auch obj.__dict__['x'] direkt verwenden und bekommen, was ich will.Unterschied zwischen __getattribute__ und obj .__ dict __ ['x'] in Python?

Ich bin ein wenig verwirrt über was ist der Unterschied? Auch wenn ich getattr(obj, name) verwende, ruft es __getattribute__ oder obj.__dict__[name] intern auf?

Vielen Dank im Voraus.

+0

http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute sollte Ihre Zweifel beseitigen. –

+0

@AashishP danke für die kommentierung. Aber dieser Post erklärt den Unterschied zwischen "__getattr__" und "__getattribute__". Es scheint, dass "getattr" wenig mit "__getattr__" zu tun hat, also implizieren Sie, dass "getattr" tatsächlich gleich "obj .__ dict __ [name]" ist? – cizixs

+0

Ja, richtig. Ich habe versucht, CPython Quellcode zu graben und hier ist, was ich gefunden habe, in Klartext, http://stackoverflow.com/questions/24863787/python-the-getattribute-method-and-descriptors –

Antwort

1

__getattribute__() Methode ist für die Verarbeitung von Attributen niedrigerer Ebene.

Die Standardimplementierung versucht, den Namen im internen __dict__ (oder __slots__) zu finden. Wenn das Attribut nicht gefunden wird, ruft es __getattr__() auf.

UPDATE (wie im Kommentar):

Sie sind verschiedene Möglichkeiten für Attribute in dem Python-Datenmodell zu finden. Sie sind interne Methoden, um in jeder möglichen Situation richtig zu reagieren. Ein Hinweis: "Die Maschine ist in object.__getattribute__(), die b.x in type(b).__dict__['x'].__get__(b, type(b)) umwandelt." von docs.python.org/3/howto/descriptor.html

+0

Bedeutet das, dass '__getattribute__' das Attribut try find in '__dict__' aufruft und weitere Dinge erledigt? Mit anderen Worten: "__getattribute__" ist eine Obermenge der '__dict__' Methode. – cizixs

+0

Sie sind verschiedene Methoden zum Suchen von Attributen im Python-Datenmodell. Sie sind interne Methoden, um in jeder möglichen Situation richtig zu reagieren. Ein Hinweis: "Die Maschine befindet sich in' object .__ getattribute __() ', die' b.x' in 'type (b) umwandelt .__ dict __ ['x'] .__ get __ (b, tippe (b))'. " von https://docs.python.org/3/howto/descriptor.html – tuned

0

Nicht jedes Python-Objekt hat ein Wörterbuch, in dem Attribute gespeichert sind, es gibt Steckplätze, Eigenschaften und Attribute, die berechnet werden, wenn sie benötigt werden. Sie können auch __getattribute__ und __getattr__ überschreiben. Der Zugriff auf Attribute ist komplizierter als ein einfaches Suchen nach einem Wörterbuch. So ist die normale Art und Weise Attribut zuzugreifen, ist durch

obj.x 

, wenn Sie einen Variable mit Attributnamen haben:

getattr(obj, name) 

Normalerweise sollten Sie nicht die internen Attribute verwenden __xxx__.

+0

Danke für die Klarstellung. Ich habe irgendwo gelesen, dass, wenn ich 'obj.x' benutze,' __________attributiert werden kann, wenn nicht gefunden, wird'__getattr__' aufgerufen. Wo ist die interne '__dict__' Variable? Wenn es verwendet wird, wenn ich auf ein Instanzattribut zugreife und es nicht empfehle, es direkt zu verwenden, worum geht es dann? – cizixs

0

Attribute in __dict__ sind nur eine Teilmenge aller Attribute, die ein Objekt hat.

Betrachten Sie diese Klasse:

class C: 
    ac = "+AC+" 
    def __init__(self): 
     self.ab = "+AB+" 

    def show(self): 
     pass 

Eine Instanz ic = C() dieser Klasse Attribute haben 'ab', 'ac' und 'show' (und einige andere). Die __gettattribute__ findet sie alle, aber nur das 'ab' ist in der ic.__dict__ gespeichert. Die anderen beiden können in C.__dict__ gefunden werden.

Verwandte Themen