File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2222| Результат | Одно значение или список | Итератор (объект-генератор) |
2323| Память | Хранит всё сразу в RAM | Вычисляет элементы на ходу |
2424
25+ ## Основные методы
26+
27+ | Метод | Что делает | Особенности |
28+ | -------------| ------------------------------------| ------------------------------------------------------------------------------------------------|
29+ | ` __next__ ` | Возвращает следующее значение. | Вызывается автоматически при использовании функции ` next(gen) ` или в цикле for. |
30+ | ` __send__ ` | Отправляет значение в генератор. | ` value ` становится результатом текущего выражения ` yield ` внутри генератора. |
31+ | ` __throw__ ` | Бросает исключение в месте паузы. | Позволяет генератору обработать ошибку или завершиться через ` try...except ` . |
32+ | ` __close__ ` | Останавливает генератор. | Выбрасывает ` GeneratorExit ` внутри генератора, чтобы он мог корректно освободить ресурсы. |
33+
34+
2535## Примеры
2636
2737``` python
Original file line number Diff line number Diff line change 1+ ## Определение
2+
3+ !!! info ""
4+ ` __slots__ ` — это специальный атрибут класса, который позволяет явно ограничить набор атрибутов для его экземпляров.
5+ Вместо динамического словаря ` __dict__ ` Python выделяет фиксированное место в памяти только под указанные поля.
6+
7+ ## Зачем нужны
8+
9+ <span class =" badge " >slots</span > используются для оптимизации приложений, создающих миллионы мелких объектов
10+ (например, точек в 3D‑графике или записей в БД).
11+
12+ Основная цель — значительная экономия оперативной памяти за счёт отказа от хранения тяжеловесного словаря
13+ ` __dict__ ` в каждом объекте. Кроме того, доступ к атрибутам через слоты происходит быстрее, так как Python не выполняет поиск по хеш‑таблице словаря.
14+
15+ ``` python
16+ class Point :
17+ # Явно задаем список разрешенных полей
18+ __slots__ = (' x' , ' y' )
19+
20+ def __init__ (self , x , y ):
21+ self .x = x
22+ self .y = y
23+
24+ p = Point(10 , 20 )
25+ print (p.x) # 10
26+
27+ # Попытка добавить новое поле вызовет ошибку
28+ try :
29+ p.z = 30
30+ except AttributeError :
31+ print (" Ошибка: нельзя добавлять новые поля!" ) # Сработает это
32+ ```
33+
34+ ## Ключевые мысли
35+
36+ - ` __slots__ ` — это про оптимизацию памяти, а не про «инкапсуляцию» или защиту данных.
37+ - Если вы наследуетесь от класса со слотами, в дочернем классе тоже нужно прописать ` __slots__ ` , иначе у него снова появится ` __dict__ ` .
38+ - Использование слотов лишает возможности использовать множественное наследование, если у родителей непустые пересекающиеся слоты.
Original file line number Diff line number Diff line change 1+ class Point :
2+ __slots__ = ('x' ,'y' ) # Явное разрешение определённых полей
3+
4+ def __init__ (self , x , y ):
5+ self .x = x
6+ self .y = y
7+
8+ p = Point (10 ,20 )
9+ print (p .x ) # 10
10+
11+ try :
12+ p .z = 30
13+ except AttributeError :
14+ print ("Ошибка: нельзя добавлять новые поля" )
You can’t perform that action at this time.
0 commit comments