Применение __slots__
в классах Python
Теперь, когда вы понимаете концепцию __slots__
и ее преимущества, давайте рассмотрим, как применить ее в своих классах Python.
Определение __slots__
Для использования __slots__
в классе Python вам нужно определить атрибут __slots__
в виде списка или кортежа строк, где каждая строка представляет имя допустимого атрибута.
class Person:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
В приведенном выше примере класс Person
имеет два допустимых атрибута: name
и age
.
Доступ к атрибутам
Когда вы используете __slots__
, вы можете получить доступ к атрибутам экземпляра так же, как и в обычном классе:
person = Person('John Doe', 30)
print(person.name) ## Output: John Doe
print(person.age) ## Output: 30
Ограничения и соображения
Как уже упоминалось ранее, при использовании __slots__
есть некоторые ограничения:
- Нельзя добавлять динамические атрибуты к экземпляру класса с
__slots__
.
- Нельзя наследоваться от класса, который не определяет
__slots__
.
- Нельзя использовать
__slots__
для определения свойств или методов.
Важно тщательно рассмотреть достоинства и ограничения __slots__
перед их применением к своим классам. В некоторых случаях экономия памяти может не оправдать дополнительные ограничения.
Сравнение производительности
Для иллюстрации выгоды в производительности при использовании __slots__
, давайте сравним использование памяти класса с и без __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"Memory usage of PersonWithDict: {sys.getsizeof(person_with_dict)} bytes")
print(f"Memory usage of PersonWithSlots: {sys.getsizeof(person_with_slots)} bytes")
На системе Ubuntu 22.04 вывод этого кода может быть таким:
Memory usage of PersonWithDict: 64 bytes
Memory usage of PersonWithSlots: 56 bytes
Как вы можете видеть, экземпляр класса PersonWithSlots
использует меньше памяти, чем экземпляр класса PersonWithDict
, что демонстрирует выгоду оптимизации памяти при использовании __slots__
.
Поняв, как применить __slots__
в своих классах Python, вы можете эффективно оптимизировать использование памяти своих приложений и повысить их общую производительность.