Die Anwendung von __slots__
in Python-Klassen
Jetzt, da Sie das Konzept von __slots__
und seine Vorteile verstehen, untersuchen wir, wie es in Ihren Python-Klassen angewendet werden kann.
Die Definition von __slots__
Um __slots__
in einer Python-Klasse zu verwenden, müssen Sie das Attribut __slots__
als Liste oder Tupel von Strings definieren, wobei jeder String den Namen eines erlaubten Attributes darstellt.
class Person:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
Im obigen Beispiel hat die Klasse Person
zwei erlaubte Attribute: name
und age
.
Das Zugreifen auf Attribute
Wenn Sie __slots__
verwenden, können Sie auf die Attribute einer Instanz genauso zugreifen wie bei einer normalen Klasse:
person = Person('John Doe', 30)
print(person.name) ## Ausgabe: John Doe
print(person.age) ## Ausgabe: 30
Einschränkungen und Überlegungen
Wie bereits erwähnt, gibt es einige Einschränkungen bei der Verwendung von __slots__
:
- Sie können keine dynamischen Attribute zu einer Instanz einer Klasse mit
__slots__
hinzufügen.
- Sie können nicht von einer Klasse erben, die ebenfalls kein
__slots__
definiert.
- Sie können
__slots__
nicht verwenden, um Eigenschaften oder Methoden zu definieren.
Es ist wichtig, die Vorteile und Einschränkungen von __slots__
sorgfältig zu berücksichtigen, bevor Sie es auf Ihre Klassen anwenden. In einigen Fällen können die Arbeitsspeicherersparnisse nicht das zusätzliche Risiko der eingeschränkten Funktionalität rechtfertigen.
Vergleich der Leistung
Um die Leistungsvorteile der Verwendung von __slots__
zu veranschaulichen, vergleichen wir die Arbeitsspeichernutzung einer Klasse mit und ohne __slots__
:
import sys
class PersonWithDict:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonWithSlots:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
person_with_dict = PersonWithDict('John Doe', 30)
person_with_slots = PersonWithSlots('John Doe', 30)
print(f"Arbeitsspeichernutzung von PersonWithDict: {sys.getsizeof(person_with_dict)} Bytes")
print(f"Arbeitsspeichernutzung von PersonWithSlots: {sys.getsizeof(person_with_slots)} Bytes")
Auf einem Ubuntu 22.04-System könnte die Ausgabe dieses Codes wie folgt aussehen:
Arbeitsspeichernutzung von PersonWithDict: 64 Bytes
Arbeitsspeichernutzung von PersonWithSlots: 56 Bytes
Wie Sie sehen können, verwendet die Instanz der Klasse PersonWithSlots
weniger Arbeitsspeicher als die Instanz der Klasse PersonWithDict
, was die Arbeitsspeicheroptimierungsvorteile der Verwendung von __slots__
demonstriert.
Indem Sie verstehen, wie __slots__
in Ihren Python-Klassen angewendet werden kann, können Sie die Arbeitsspeichernutzung Ihrer Anwendungen effektiv optimieren und deren Gesamtleistung verbessern.