все 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Сообщить о неточности