Напишите параметрический декоратор Record(строка, **именные_параметры) произвольного класса, использующего __slots__ в качестве объектной модели. Декоратор должен добавлять в возвращаемый класс слоты, имена которых перечислены через пробел в строке, и поля только для чтения, имена и значения которых перечислены в именных_параметрах. Имена не могут начинаться на "_". Слоты возвращаемого класса перечисляются в алфавитном порядке. Имена полей могут перекрывать имена слотов родительского класса.
Дополнительно должна поддерживаться итерация по объекту — она возвращает имена слотов и полей (имя которых не начинается на "_") в алфавитном порядке
Дополнительно должно поддерживаться преобразование в строку в таком формате (поля берутся также в алфавитном порядке): для неопределённых слотов выводится только имя, для определённых — имя=значение, для переменных — имя:значение, разделитель — «|» (см. пример).
1 @Record("b c", d=11, e=12)
2 class C:
3 __slots__ = ["a", "b"]
4 c = 8
5 d = 9
6
7
8 c = C()
9 c.a, c.c = 42, 100500
10 print(c, "//", "".join(c.__slots__))
11 print(*(getattr(c, attr, "<NOPE>") for attr in c))
12 for i, attr in enumerate(c):
13 try:
14 setattr(c, attr, i)
15 except AttributeError:
16 pass
17 print(c, "//", *(getattr(c, attr, "<NOPE>") for attr in c))
a=42|b|c=100500|d:11|e:12 // abc 42 <NOPE> 100500 11 12 a=0|b=1|c=2|d:11|e:12 // 0 1 2 11 12