Skip to content

Commit fe57ae3

Browse files
committed
feat: add __slots__ page
1 parent f6ac4c4 commit fe57ae3

3 files changed

Lines changed: 62 additions & 0 deletions

File tree

docs/python/generator.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@
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

docs/python/slots.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
- Использование слотов лишает возможности использовать множественное наследование, если у родителей непустые пересекающиеся слоты.

notes/slots.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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("Ошибка: нельзя добавлять новые поля")

0 commit comments

Comments
 (0)