2010-07-30 1 views
10

Ich würde gerne wissen, warum man ein neues Attribut ("neu" bedeutet "nicht zuvor im Klassenkörper definiert") für eine Instanz eines benutzerdefinierten Typs erstellen kann, aber nicht in der Lage ist, dasselbe für a zu tun Eingebauter Typ, wie object selbst.Warum akzeptieren benutzerdefinierte Typen Ad-hoc-Attribute in Python (und nicht integrierte Builds)?

Ein Codebeispiel:

>>> class SomeClass(object): 
...  pass 
... 
>>> sc = SomeClass() 
>>> sc.name = "AAA" 
>>> sc.name 
'AAA' 
>>> obj = object() 
>>> obj.name = "BBB" 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'name' 

Antwort

6

Einige Objekte haben nicht die __dict__ Attribut (das ist ein Wörterbuch, das alle benutzerdefinierten speichert ‚neu definiert‘ Attribute). Sie können dasselbe Verhalten mit der Variablen __slots__ emulieren (siehe python reference). Wenn Sie eine Klasse mit __dict__ unterklassifizieren, hat die Variable __slots__ keine Auswirkungen. Und da Sie Objekt für neue Stilklassen immer unterklassieren, darf das Objekt nicht __dict__ haben, da dies die Verwendung von __slots__ unmöglich machen würde. Die Klassen ohne __slots__ benötigen weniger Speicher und sind wahrscheinlich etwas schneller.

Verwandte Themen