Um eine beliebige Attributzuweisung zu unterstützen, benötigt ein Objekt eine : ein dem Objekt zugeordnetes Diktat, in dem beliebige Attribute gespeichert werden können. Ansonsten gibt es keine neue Attribute.
Eine Instanz object
tut nicht carry um einen __dict__
- wenn es so wäre, vor dem schrecklichen Kreis Abhängigkeit Problem (da dict
, wie die meisten alles andere, erbt von object
;-), würde dies Sattel jeden Objekt in Python mit einem dict, was einen Overhead von viele Bytes pro Objekt bedeuten würde, die derzeit kein dict haben oder brauchen (im Wesentlichen haben alle Objekte, die keine willkürlich zuweisbaren Attribute haben, kein dict oder brauchen es)).
Zum Beispiel die hervorragende pympler
Projekt mit (Sie können es über svn von here erhalten), können wir einige Messungen tun ...:
>>> from pympler import asizeof
>>> asizeof.asizeof({})
144
>>> asizeof.asizeof(23)
16
Sie würden nicht alle int
wollen 144 aufzunehmen Bytes statt nur 16, rechts -)
wenn Sie nun eine Klasse machen (von was auch immer vererben), die Dinge ändern sich ...:
>>> class dint(int): pass
...
>>> asizeof.asizeof(dint(23))
184
... die __dict__
ist jetzt hinzugefügt (plus, ein wenig mehr Overhead) - so eine dint
Instanz kann beliebige Attribute haben, aber Sie bezahlen ziemlich viel Platz für diese Flexibilität.So
was, wenn man wollte int
s mit nur einem zusätzlichem Attribute foobar
...? Es ist eine seltene Notwendigkeit, aber Python hat zum Zweck einen speziellen Mechanismus bietet ...
>>> class fint(int):
... __slots__ = 'foobar',
... def __init__(self, x): self.foobar=x+100
...
>>> asizeof.asizeof(fint(23))
80
... nicht ganz so winzig wie ein int
wohlgemerkt! (oder sogar die beiden int
s, eine der self
und eine der self.foobar
- die zweite kann neu zugewiesen werden), aber sicherlich viel besser als ein dint
.
Wenn die Klasse das __slots__
spezielle Attribut (eine Folge von Strings) hat, dann ist die class
Aussage (genauer gesagt, die Standard-Metaklasse, type
) tun nicht jede Instanz dieser Klasse mit einem __dict__
auszustatten (und damit die Fähigkeit, willkürliche Attribute zu haben), nur eine endliche, starre Menge von "Slots" (im Grunde Orte, die jeweils eine Referenz auf ein Objekt haben können) mit den gegebenen Namen.
Im Austausch für die verlorene Flexibilität, erhalten Sie eine Menge von Bytes pro Instanz (wahrscheinlich nur sinnvoll, wenn Sie zig Millionen von Instanzen gallivanting haben, aber sind Anwendungsfälle dafür).
Reine Vermutung: Der 'Objekt'-Typ ist unveränderlich und neue Attribute können nicht hinzugefügt werden? Das scheint so, als wäre es am sinnvollsten. –
@ S.Lott: Siehe die erste Zeile dieser Frage. Nur Neugier. – Smashery
Ihr Titel ist irreführend, Sie versuchen, Attribute für Klassenobjekte "object" und nicht für die Klasse "object" festzulegen. – dhill