12.02 Метаклассы и аннотации
Метаклассы
- зачем (не) нужны
Модуль types (в частности FunctionType)
Напишем метакласс, который ничего не меняет, но выводит все параметры__call__, __new__ и __init__
- Добавим туда вывод имён всех методов
Задача_1. Написать метакласс dump, который "обмазывает" все имеющиеся в словаре методы класса выводом имени метода и значений его параметров (*args, **kwargs)
- реализация может закладываться на то, что через параметры методов передаются значения типов str, int, float и bool (и никаких других типов)
формат вывода: имя_метода: кортеж_args, словарь_kwargs
- вывод должен осуществляться при каждом вызове метода
- Пример:
- →
__init__: (10,), {} add: (9,), {} 29 add: (9,), {'another': 10} 29
Аннотации
- зачем (не) нужны)
Написать простой аннотированный класс и посмотреть в нём аннотации
Задача_2. Написать метакласс check, который добавляет в создаваемый класс метод check_annotations(), возвращающий True, если типы всех аннотированных полей объекта существуют и соответствуют аннотации, и False в противном случае
- Пример:
- →
False False True True
- Пример:
mypy/mypyc
(если успеем, потыкаем)