Джерело
Python Nation🐍🇺🇦 | slots__ - коли обʼєктів багатоЗа замовчуванням кожен обʼєкт у пайтоні ...
316 Охват/переглядів
2026-09-25 07:03
Повідомлення №720
__slots__ - коли обʼєктів багато
За замовчуванням кожен обʼєкт у пайтоні тримає свій __dict__, тобто словник з атрибутами. Це зручно бо можна додати будь-який атрибут на льоту, але словник займає памʼять. Коли обʼєктів кілька то це не є проблемою, а от коли їх багато, то вже стає помітно по пам'яті.
__slots__ каже класу: атрибути тільки ці, словник не потрібен.
class Receipt:
__slots__ = ("id", "total", "paid")
def __init__(self, id, total, paid):
self.id = id
self.total = total
self.paid = paid
Що це дає:
- менше памʼяті на кожен обʼєкт (немає __dict__)
- трохи швидший доступ до атрибутів
Ціна - гнучкість. Новий атрибут вже не додаси:
r = Receipt(1, 100, True)
r.discount = 10 # AttributeError
І ще пара нюансів: наслідування працює, але кожен клас у ланцюгу має свої __slots__, інакше __dict__ повернеться. З @dataclass теж дружить - просто @dataclass(slots=True).
Коротко: якщо клас створюється багато разів і набір полів фіксований - __slots__ економить реальну памʼять. Для звичайних класів це зайве.
За замовчуванням кожен обʼєкт у пайтоні тримає свій __dict__, тобто словник з атрибутами. Це зручно бо можна додати будь-який атрибут на льоту, але словник займає памʼять. Коли обʼєктів кілька то це не є проблемою, а от коли їх багато, то вже стає помітно по пам'яті.
__slots__ каже класу: атрибути тільки ці, словник не потрібен.
class Receipt:
__slots__ = ("id", "total", "paid")
def __init__(self, id, total, paid):
self.id = id
self.total = total
self.paid = paid
Що це дає:
- менше памʼяті на кожен обʼєкт (немає __dict__)
- трохи швидший доступ до атрибутів
Ціна - гнучкість. Новий атрибут вже не додаси:
r = Receipt(1, 100, True)
r.discount = 10 # AttributeError
І ще пара нюансів: наслідування працює, але кожен клас у ланцюгу має свої __slots__, інакше __dict__ повернеться. З @dataclass теж дружить - просто @dataclass(slots=True).
Коротко: якщо клас створюється багато разів і набір полів фіксований - __slots__ економить реальну памʼять. Для звичайних класів це зайве.