12.03 Метаклассы и аннотации

  1. Метаклассы — зачем (не) нужны)
    • Модуль types (в частности FunctionType)

    • {i} Напишем метакласс, который ничего не меняет, но выводит все параметры__call__, __new__ и __init__

      • Добавим туда вывод имён всех методов
    • <!> Задача_1. Написать метакласс dump, который "обмазывает" все методы класса выводом имени метода и значений его параметров (*args, **kwargs)

      • реализация может закладываться на то, что через параметры методов передаются значения типов str, int, float и bool (и никаких других типов)
      • формат вывода: имя_метода, список_args, словарь_kwargs
      • вывод должен осуществляться при каждом вызове метода
      • Пример:
           1 class C(metaclass=dump):
           2     def __init__(self, val):
           3         self.val = val
           4 
           5     def add(self, other, another=None):
           6         return self.val + other + (another or self.val)
           7 
           8 c = C(10)
           9 print(c.add(9))
          10 print(c.add(9,another=10))
        
        __init__: (10,), {}
        add: (9,), {}
        29
        add: (9,), {'another': 10}
        29
  2. Аннотации — зачем (не) нужны)
    • {i} Написать простой аннотированный класс и посмотреть в нём аннотации

    • <!> Задача_2. Написать метакласс check, который добавляет в создаваемый класс метод check_annotations(), возвращающий True, если типы всех аннотированных полей объекта существуют и соответствуют аннотации, и False в противном случае

      • Пример:
           1 class C(metaclass=check):
           2     A: int
           3     B: str = "QQ"
           4 
           5 c = C()
           6 print(c.check_annotations())
           7 c.A = "ZZ"
           8 print(c.check_annotations())
           9 c.A = 100500
          10 print(c.check_annotations())
          11 c.B = type("Boo",(str,),{})(42)
          12 print(c.check_annotations())
        
        False
        False
        True
        True
  3. Если успеем — потыкаем в mypy/mypyc

LecturesCMC/PythonIntro2020/Prac/13_MetaclassAnnotations (последним исправлял пользователь FrBrGeorge 2020-12-10 11:39:38)