Slots ist der richtige Weg:
Die pythonische Methode besteht darin, Slots zu verwenden, anstatt mit dem herumzuspielen __setter__
. Während es das Problem lösen kann, gibt es keine Leistungsverbesserung. Die Attribute von Objekten werden in einem Wörterbuch " __dict__
" gespeichert. Aus diesem Grund können Sie Objekten von Klassen, die wir bisher erstellt haben, dynamisch Attribute hinzufügen. Die Verwendung eines Wörterbuchs zur Speicherung von Attributen ist sehr praktisch, kann jedoch Platzverschwendung für Objekte bedeuten, die nur eine geringe Anzahl von Instanzvariablen enthalten.
Steckplätze sind eine gute Möglichkeit, um dieses Platzverbrauchsproblem zu umgehen. Anstatt ein dynamisches Diktat zu haben, mit dem Objekte dynamisch zu Objekten hinzugefügt werden können, bieten Slots eine statische Struktur, die das Hinzufügen nach dem Erstellen einer Instanz verhindert.
Wenn wir eine Klasse entwerfen, können wir Slots verwenden, um die dynamische Erstellung von Attributen zu verhindern. Um Slots zu definieren, müssen Sie eine Liste mit dem Namen definieren __slots__
. Die Liste muss alle Attribute enthalten, die Sie verwenden möchten. Wir demonstrieren dies in der folgenden Klasse, in der die Slots-Liste nur den Namen für ein Attribut "val" enthält.
class S(object):
__slots__ = ['val']
def __init__(self, v):
self.val = v
x = S(42)
print(x.val)
x.new = "not possible"
=> Es kann kein Attribut "neu" erstellt werden:
42
Traceback (most recent call last):
File "slots_ex.py", line 12, in <module>
x.new = "not possible"
AttributeError: 'S' object has no attribute 'new'
NB:
Seit Python 3.3 ist der Vorteil der Optimierung des Platzverbrauchs nicht mehr so beeindruckend. Mit Python 3.3 werden Key-Sharing- Wörterbücher zum Speichern von Objekten verwendet. Die Attribute der Instanzen können einen Teil ihres internen Speichers untereinander teilen, dh den Teil, in dem die Schlüssel und die entsprechenden Hashes gespeichert sind. Dies hilft, den Speicherverbrauch von Programmen zu reduzieren, wodurch viele Instanzen nicht integrierter Typen erstellt werden. Es ist jedoch immer noch der richtige Weg, um dynamisch erstellte Attribute zu vermeiden.
Die Verwendung von Slots ist auch mit eigenen Kosten verbunden. Die Serialisierung wird unterbrochen (z. B. Pickle). Es wird auch Mehrfachvererbung brechen. Eine Klasse kann nicht von mehr als einer Klasse erben, die entweder Slots definiert oder ein im C-Code definiertes Instanzlayout hat (wie Liste, Tupel oder Int).
__setattr__
aber das wäre wahrscheinlich hacky.