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 mita.__dict__['x']
starten, danntype(a).__dict__['x']
, und weiter durch die Basisklassen vontype(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ürb
intype(a).__mro__
type(b).__dict__[x]
fürb
intype(a).__mro__
c.__dict__[x]
fürc
intype(b).__mro__
- ......
Habe ich Recht? Diese
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
@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? –
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