Контроль доступа к полям класса
.__getattr__(self, name) (setattr, delattr)
- если нет в ПИ
полное замещение, кроме спецметодов
Можно переписать и __.dir__(self)
TODO
Дескрипторы
Дескриптор — это такой объект. В его классе должен быть метод __get__(). Если так, то когда такой объект является полем некоторого класса, доступ к этому полу становится программным.
Если при этом определён __set__() и/или __delete__(), это называется дескриптором данных и соответствующее имя нельзя перебить в объекте.
Если определён только __set__(), это называется дескриптором не-данных и соответствующее имя можно перебить в объекте.
TODO примеры
Да, @property — это такой более высокоуровневый способ организации дескрипторов.
Слоты
Если определить в классе поле __slots__, задающее список имён атрибутов класса, в объектах этого класса нельзя будет заводить полей с новыми именами. Поиск по пространству имён таких классов работает быстрее, памяти ест меньше.
TODO примеры
Лямбда-функции
Лямбда-функция — это функция-выражение. Задаётся одной строкой. Нужна для того, чтобы не плодить ненужных имён и оперативно конструировать функции
1 >>> a = list(range(10,60,7))
2 >>> a
3 [10, 17, 24, 31, 38, 45, 52, 59]
4 >>> def key(n):
5 ... return (n+1)%5
6 ...
7 >>> key(8)
8 4
9 >>> sorted(a, key=key)
10 [24, 59, 10, 45, 31, 17, 52, 38]
11 >>> fun = lambda n: (n+1)%5
12 >>> fun(8)
13 4
14 >>> sorted(a, key=fun)
15 [24, 59, 10, 45, 31, 17, 52, 38]
16 >>> sorted(a, key=lambda n: (n+1)%5)
17 [24, 59, 10, 45, 31, 17, 52, 38]
18
map(), filter()
functools.reduce()
TODO ещё примеры.
Конструирование классов
- Класс — это такой объект
type() как конструктор классов
- базовые классы, пространство атрибутов
Метакласс — конструктор классов
Использование (class C(metaclass=M):)
Перегрузка __call__() — создание экземпляра
Перегрузка __new__() — создание класса
Перегрузка __prepare__() — создание ПИ
TODO примеры (Singleton и ещё что-нибудь)
Д/З
Прочесть про всё в документации, прощёлкать статьи про дескрипторы, про слоты и про метаклассы
ВНИМАНИЕ Д/З больше не будет, доделывайте что есть.