1

Gemäß Python 2.7.12 Dokumentation, 3.4.2.3. Unter Berufung auf Descriptors¶:Warum werden Metaclass-Attribute nicht in Instanzattributsuchen durchsucht?

Das Standardverhalten für Attribut Zugriff zu bekommen, Satz oder löschen das Attribut aus einem Wörterbuch des Objekts. Zum Beispiel hat a.x eine Lookup-Kette mit a.__dict__['x'] starten, dann type(a).__dict__['x'], und weiter durch die Basisklassen von type(a)ohne metaclasses.

Aber warum Metaklassen ausgeschlossen sind?

Wenn Sie fortlaufend type(self) aufrufen, egal was self ist, ein Instanzobjekt oder ein Typobjekt, erhalten Sie schließlich . Ich kann also nicht verstehen, warum Metaklassen dieses "Privileg" genießen.


By the way, ich bin ein wenig von diesem Zitat verwirrt: Zum Beispiel Objekte, object.__getattribute__ verwendet werden, so dass ich denke, dass die Lookup-Kette sollte wie folgt aussehen:

  • a.__dict__['x']
  • type(a).__dict__['x']
  • b.__dict__[x] für b in type(a).__mro__
  • type(b).__dict__[x] für b in type(a).__mro__
  • c.__dict__[x] für c in type(b).__mro__
  • ......

Habe ich Recht? Diese

+0

Ich sehe Sie experimentieren mit Metaklassen und Attributzugriff - irgendeinen Grund, warum Sie Python 3 nicht verwenden?Fast jedes Projekt kann Python 3 heute verwenden, und es gibt eine Menge Funktionen/Änderungen, die es nicht in Python 2 geschafft haben. – jsbueno

+0

@jsbueno Hmm ... Aus Gründen der Kompatibilität denke ich. Mein College (eigentlich mein Klassenkamerad. Wir arbeiten an einem Projekt zusammen.) Empfahl mir, zuerst Python2 zu lernen, weil viele Module Python3 noch nicht unterstützen und sie es in naher Zukunft vielleicht nicht unterstützen. Meine Experimente dienen dazu, zu verstehen, wie Python im Hintergrund besser funktioniert, und sie werden hilfreich sein, wenn ich irgendwann zu Python3 wechseln will, oder? –

+0

Ich denke, die "vielen Module haben noch keine Python 3-Unterstützung" gilt ab 2015 nicht mehr. Die wichtigsten Funktionen arbeiten jetzt in Python3, und vor allem für das tiefe Verständnis, das Sie suchen, würde ich sagen, Python3 ist viel relevanter. Pythons Ende der Linie ist für 2020 geplant. Wenn Sie heute ein Projekt starten, also 3 Jahre, bevor Sie es migrieren müssen - ich würde nicht sagen, dass es sich lohnt. – jsbueno

Antwort

1

ist, da das Attribut-Lookup durchsucht alle Basen von type(a) (type(a).__mro__), anstatt alle Typen von type(a) (type(type(a))).

Auch wird type(self) nicht ständig aufgerufen, so dass die Lookup-Kette wie folgt aussieht:

  • a.__dict__['x']
  • type(a).__dict__['x']
  • b.__dict__[x] for b in type(a).__mro__
  • raise AttributeError

Wie @jsbueno weise darauf in dem Kommentar, der zweite st ep ist tatsächlich in der dritten enthalten. Dies ist, weil für jede Klasse, sagen wir, Klasse C, C selbst ist genau das erste Element in C.__mro__.

+0

Eigentlich ist der zweite Schritt in der dritten enthalten - zu verstehen, was passiert, "Typ (a) .__ dict __ ['x']" Verifikation ist in 'b .__ dict __ [x] für b in Typ (a) enthalten .__ mro__ ' – jsbueno

+0

@jsbueno Ja, du hast Recht. Eine Klasse 'C' selbst ist genau das erste Element in' C .__ mro__'. Antwort bearbeitet. –

Verwandte Themen