Spielautomaten sind der richtige Weg:
Der pythonische Weg ist die Verwendung von Slots, anstatt mit der __setter__
. Dadurch wird das Problem zwar gelöst, aber die Leistung nicht verbessert. Die Attribute von Objekten werden in einem Wörterbuch gespeichert " __dict__
"Das ist der Grund, warum Sie den Objekten der Klassen, die wir bisher erstellt haben, dynamisch Attribute hinzufügen können. Die Verwendung eines Wörterbuchs für die Speicherung von Attributen ist sehr praktisch, kann aber bei Objekten, die nur eine geringe Anzahl von Instanzvariablen haben, eine Platzverschwendung bedeuten.
Steckplätze sind eine gute Möglichkeit, dieses Problem des Platzverbrauchs zu umgehen. Anstelle eines dynamischen Diktats, das das dynamische Hinzufügen von Attributen zu Objekten erlaubt, bieten Slots eine statische Struktur, die das Hinzufügen von Attributen nach der Erstellung einer Instanz verbietet.
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 __slots__
. Die Liste muss alle Attribute enthalten, die Sie verwenden möchten. Wir demonstrieren dies in der folgenden Klasse, in der die Slotliste 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 gelingt nicht, ein Attribut "neu" zu erstellen:
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'
Anmerkungen:
-
Seit Python 3.3 ist der Vorteil der Optimierung des Platzverbrauchs nicht mehr so beeindruckend. Mit Python 3.3 Gemeinsame Nutzung von Schlüsseln Wörterbücher werden für die Speicherung von Objekten verwendet. Die Attribute der Instanzen sind in der Lage, einen Teil ihres internen Speichers untereinander aufzuteilen, d. h. den Teil, in dem die Schlüssel und die entsprechenden Hashes gespeichert sind. Dies hilft, den Speicherverbrauch von Programmen zu reduzieren, die viele Instanzen von nicht-builtin Typen erzeugen. Aber es ist immer noch der richtige Weg, um dynamisch erzeugte Attribute zu vermeiden.
-
Die Verwendung von Steckplätzen ist auch mit Kosten verbunden. Es wird die Serialisierung brechen (z.B. Pickle). Es wird auch die Mehrfachvererbung unterbrechen. Eine Klasse kann nicht von mehr als einer Klasse erben, die entweder Slots definiert oder ein Instanzlayout hat, das in C-Code definiert ist (wie list, tuple oder int).