Das Slots -Attribut in Python ist ein Tool, mit dem Datenattribute (Instanzvariablen) auf der Klassenebene explizit deklariert werden, was zu einer effizienteren Speicherverwendung und einem schnelleren Zugriff auf Attribut führen kann. Wenn eine Klasse ein __slots__
Attribut definiert, erstellt Python für jede Instanz der Klasse ein kleines Array mit fester Größe, anstatt ein dynamisches Wörterbuch zum Speichern von Instanzattributen zu verwenden. Dieser Mechanismus dient mehreren Zwecken:
__slots__
wird das __dict__
des Instanz nicht erstellt, was den Speicher speichert, insbesondere wenn es sich um eine große Anzahl von Instanzen handelt.__slots__
-fähigen Klasse kann schneller sein als der Zugriff auf Attribute in einer Standard -Wörterbuch -basierte Instanz, da es den Overhead von Wörterbuch -Lookups vermeidet.__slots__
definiert ist, schränkt Python die Erstellung neuer Attribute in Fällen auf die in __slots__
definierten Attributen ein, es sei denn, __dict__
ist explizit in __slots__
enthalten. Hier ist ein grundlegendes Beispiel für die Verwendung __slots__
:
<code class="python">class Point: __slots__ = ('x', 'y') def __init__(self, x, y): self.x = x self.y = y</code>
Die Verwendung von __slots__
kann mehrere Leistungsvorteile bieten:
__slots__
die Instanz __dict__
durch ein Array mit fester Größe ersetzt, kann es den Speicherpreis von Instanzen erheblich verringern. Dies ist besonders vorteilhaft, wenn eine große Anzahl von Instanzen erstellt werden.__slots__
definiert sind, können schneller zugegriffen werden als in einem Wörterbuch. Dies liegt daran, dass der Zugriff auf ein Element in einem kleinen Array mit fester Größe im Allgemeinen schneller ist als die Durchführung einer Wörterbuch-Lookup.__slots__
können vom Müllsammler schneller gesammelt werden, da weniger Referenzen folgen.Um diese Vorteile zu veranschaulichen, betrachten Sie das folgende Beispiel:
<code class="python">import sys class StandardPoint: def __init__(self, x, y): self.x = x self.y = y class SlotPoint: __slots__ = ('x', 'y') def __init__(self, x, y): self.x = x self.y = y standard = StandardPoint(1, 2) slot = SlotPoint(1, 2) print(sys.getsizeof(standard)) # Output may be around 56 bytes print(sys.getsizeof(slot)) # Output may be around 32 bytes</code>
In diesem Beispiel verwendet die SlotPoint
-Instanz weniger Speicher als die StandardPoint
.
Die Verwendung __slots__
wirkt sich auf folgende Weise auf die Attributzuweisung aus:
__slots__
definiert ist, können nur die in __slots__
aufgeführten Attribute einer Instanz zugewiesen werden. Der Versuch, ein Attribut zuzuweisen, das nicht in __slots__
ist, erhöht einen AttributeError
, es sei denn, __dict__
ist in __slots__
enthalten.__dict__
: Standardmäßig haben Instanzen von Klassen mit __slots__
kein __dict__
. Dies bedeutet, dass die dynamische Attributzuweisung deaktiviert ist, es sei denn, __dict__
ist explizit in __slots__
enthalten.__weakref__
: Wenn die Klasse schwache Referenzen unterstützen muss, muss __weakref__
in __slots__
enthalten sein.Hier ist ein Beispiel, um diese Effekte zu demonstrieren:
<code class="python">class RestrictedPoint: __slots__ = ('x', 'y') point = RestrictedPoint() point.x = 10 # This is allowed point.y = 20 # This is allowed try: point.z = 30 # This will raise an AttributeError except AttributeError as e: print(e) # Output: 'RestrictedPoint' object has no attribute 'z'</code>
Ja, __slots__
kann in Kombination mit Vererbung verwendet werden, aber es gibt mehrere Überlegungen zu beachten:
__slots__
definiert, erbt sie die Slots von ihrer Superklasse, aber nur, wenn die Superklasse auch __slots__
definiert. Wenn eine Superklasse __slots__
nicht verwendet, werden ihre Instanzen weiterhin __dict__
verwendet, was zu Speicher -Ineffizienzen führen kann.__dict__
: Wenn eine Unterklasse dynamische Attribute zulassen möchte, kann sie __dict__
in ihre __slots__
enthalten. Dies kann jedoch den Speicherspeicherzweck für die Verwendung von __slots__
in erster Linie besiegen.__slots__
verwenden, müssen alle Klassen __slots__
definieren oder von einer Klasse erben, die __slots__
definiert. Wenn eine übergeordnete Klasse __slots__
nicht verwendet, haben Instanzen der Unterklasse immer noch ein __dict__
.Hier ist ein Beispiel, um diese Überlegungen zu veranschaulichen:
<code class="python">class Base: __slots__ = ('x',) class Derived(Base): __slots__ = ('y',) # Inherits 'x' from Base derived = Derived() derived.x = 10 # Inherited from Base derived.y = 20 # Defined in Derived class FlexibleDerived(Base): __slots__ = ('y', '__dict__') # Allows dynamic attributes flexible = FlexibleDerived() flexible.x = 10 # Inherited from Base flexible.y = 20 # Defined in FlexibleDerived flexible.z = 30 # Dynamic attribute, allowed because of __dict__</code>
Obwohl __slots__
effektiv mit Vererbung eingesetzt werden kann, muss sorgfältig geplant werden, um sicherzustellen, dass die gewünschte Speicheroptimierung und das Attributverhalten in der Klassenhierarchie erreicht werden.
Das obige ist der detaillierte Inhalt vonErklären Sie den Zweck des __SLOTS__ -Attributs.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!