Was ist das __dict__.__dict__ Attribut einer Python-Klasse?
>>> class A(object): pass
...
>>> A.__dict__
<dictproxy object at 0x173ef30>
>>> A.__dict__.__dict__
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
AttributeError: 'dictproxy' object has no attribute '__dict__'
>>> A.__dict__.copy()
{'__dict__': <attribute '__dict__' of 'A' objects> ... }
>>> A.__dict__['__dict__']
<attribute '__dict__' of 'A' objects> # What is this object?
Wenn ich A.something = 10
, dieser geht in A.__dict__
. Was ist diese <attribute '__dict__' of 'A' objects>
gefunden in A.__dict__.__dict__
, und Wann wird es etwas beinhalten?
Ein passenderes Beispiel variable gewesen wäre, habe
ive
. Zumindest wäre es gemacht habe dies eine mehr A.__dict__['ive']
Frage 😉 ich werde sehen, mich ausInformationsquelleAutor porgarmingduod | 2011-02-02
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst
A.__dict__.__dict__
unterscheidet sich vonA.__dict__['__dict__']
, und die ehemalige existiert nicht. Letzteres ist die__dict__
Attribut, das die Instanzen der Klasse haben würde. Es ist ein descriptor-Objekt zurückgibt, das interne Wörterbuch von Parametern, für die bestimmte Instanz. Kurz gesagt, die__dict__
Attribut eines Objekts kann nicht gespeichert werden im Objekt__dict__
, so dass auf Sie zugegriffen wird durch einen Deskriptor in der Klasse definiert.Um dies zu verstehen, müsste man Lesen Dokumentation der Deskriptor-Protokoll.
Die kurze version:
A
Zugang zuinstance.__dict__
wird durchA.__dict__['__dict__']
das ist das gleiche wievars(A)['__dict__']
.A.__dict__
wird durchtype.__dict__['__dict__']
(in der Theorie) das ist das gleiche wievars(type)['__dict__']
.Die lange version:
Beide Klassen und Objekte Zugriff auf Attribute sowohl durch das Attribut operator (realisiert über die Klasse oder Metaklasse ist
__getattribute__
), und die__dict__
Attribut/- Protokoll, das vonvars(ob)
.Für normale Objekte, die
__dict__
- Objekt erstellt eine separatedict
Objekt-speichert die Attribute und__getattribute__
zunächst versucht, darauf zuzugreifen und Holen Sie sich die Attribute von dort (vor dem Versuch zu sehen, die für das Attribut in der Klasse durch die Nutzung der Deskriptor-Protokoll, und vor dem Aufruf__getattr__
). Die__dict__
- Deskriptor für die Klasse implementiert den Zugriff auf das Wörterbuch.x.name
entspricht versucht diese in der Reihenfolge:x.__dict__['name']
,type(x).name.__get__(x, type(x))
,type(x).name
x.__dict__
macht das gleiche aber springt der erste aus offensichtlichen GründenDa es unmöglich für die
__dict__
voninstance
gespeichert werden__dict__
von der Instanz, darauf zugegriffen wird durch den Deskriptor-Protokoll direkt statt und werden in ein spezielles Feld in der Instanz.Ein ähnliches Szenario gilt für die Klassen, obwohl Ihre
__dict__
ist eine spezielle proxy-Objekt, das vorgibt, ein Wörterbuch (aber vielleicht nicht intern), und erlaubt es Ihnen nicht, es zu ändern oder ersetzen es durch ein anderes. Dieser proxy ermöglicht es Ihnen, unter allen anderen, den Zugriff auf die Attribute einer Klasse spezifisch sind, und nicht definiert in eine seiner Grundlagen.Standardmäßig eine
vars(cls)
einer leeren Klasse trägt drei Deskriptoren -__dict__
für die Speicherung der Attribute der Instanzen__weakref__
die intern durchweakref
und den docstring der Klasse. Die ersten beiden könnte Weg sein, wenn Sie definieren__slots__
. Dann würden Sie nicht haben__dict__
und__weakref__
Attribute, sondern Sie würden eine einzelne class-Attribut für jeden slot. Die Attribute der Instanz, dann wäre das nicht in einem Wörterbuch gespeichert, und der Zugang zu Ihnen wird von den jeweiligen Beschreibungen in der Klasse.Und schließlich die Ungereimtheit, dass
A.__dict__
unterscheidet sich vonA.__dict__['__dict__']
ist, da das Attribut__dict__
ist ausnahmsweise nie blickte invars(A)
, also, was wahr ist, für die es nicht gilt für praktisch jedes andere Attribut, das Sie verwenden würden. Zum BeispielA.__weakref__
ist das gleiche wieA.__dict__['__weakref__']
. Wenn dieser Widerspruch nicht vorhanden, mitA.__dict__
würde nicht funktionieren, und Sie hätten immervars(A)
statt.InformationsquelleAutor Rosh Oxymoron
Seit
A.__dict__
ist ein Wörterbuch speichernA
AttributeA.__dict__['__dict__']
ist der direkte Verweis auf das gleicheA.__dict__
Attribut.A.__dict__
enthält eine (Art von) Referenz auf sich selbst. Die "Art-of" - Teil ist der Grund, warum der AusdruckA.__dict__
gibt einedictproxy
anstatt einer normalendict
.A.__dict__['__dict__']
ist nicht eine Referenz zuA.__dict__
. Es implementiert die__dict__
Attribut der Instanzen. Zu versuchen, für sich selbst,A.__dict__['__dict__'].__get__(A(), A)
gibt die Attribute derA()
, währendA.__dict__['__dict__'].__get__(A, type)
ausfällt.InformationsquelleAutor vz0
Können tun einige erkunden!
Frage ich mich, was das ist?
Welche Attribute muss ein
getset_descriptor
Objekt haben?Indem Sie eine Kopie der
dictproxy
finden wir einige interessante Attribute, die speziell__objclass__
und__name__
.So
__objclass__
ist ein Verweis aufA
und__name__
ist nur der string'__dict__'
name eines Attributs vielleicht?Da haben wir es!
A.__dict__['__dict__']
ist ein Objekt verweisen kann, zurück zuA.__dict__
.__objclass__
ist die Klasse, die definiert dieses Attribut nicht, wird ein Attribut der Klasse. Das macht Ihrgetattr
Beispiel falsch. Eine weitere richtige wäregetattr(A().__dict__['__dict__'].__objclass__, A.__dict__['__dict__'].__name__)
InformationsquelleAutor Andrew Clark
Können Sie versuchen, die folgenden einfachen Beispiel zu verstehen, mehr von diesem:
Aus dem obigen Beispiel scheint es, dass die Objekte der Klasse Attribute gespeichert werden, die von Ihrer Klasse, der Klasse die Attribute gespeichert sind, die durch Ihre Klasse, die metaclasses. Dies wird auch bestätigt durch:
InformationsquelleAutor damaZhang