Python Glossary English

все Python 3ООПпонятие

__slots__

slots

__slots__ ограничивает атрибуты экземпляра, убирает __dict__, экономит память. Особенно полезно для большого числа объектов.

Синтаксис

class C:
    __slots__ = ('x', 'y')

Экономия памяти теряется, как только наследник не объявит собственный __slots__ — он снова получит __dict__. Перечисленные слоты — единственные разрешённые атрибуты: присвоить что-то за их пределами нельзя (AttributeError), и по умолчанию пропадает поддержка weakref, пока не добавишь '__weakref__' в список.

Примеры

class Point:
    __slots__ = ('x', 'y')
    def __init__(self, x, y):
        self.x = x; self.y = y
p = Point(1, 2)
print(p.x, p.y)  # → 1 2
try:
    p.z = 3
except AttributeError as e:
        print(e)  # → 'Point' object has no attribute 'z'
print(hasattr(p, '__dict__'))  # → False — словаря атрибутов нет
import sys
class WithDict:
    def __init__(self, x, y):
        self.x = x; self.y = y
class WithSlots:
    __slots__ = ('x','y')
    def __init__(self, x, y):
        self.x = x; self.y = y
print(sys.getsizeof(WithDict(1,2)))   # → больше
print(sys.getsizeof(WithSlots(1,2))) # → меньше
# __slots__ в наследовании
class Base:
    __slots__ = ('x',)
class Child(Base):
    __slots__ = ('y',)
c2 = Child()
c2.x = 1; c2.y = 2
print(c2.x, c2.y)  # → 1 2
# Частичные __slots__
class Mixed:
    __slots__ = ('x',)
    def __init__(self, x, y):
        self.x = x
        # self.y = y  # → AttributeError
print(Mixed(1,2).x)  # → 1

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности