Написать декоратор класса под названием sizer, который будет добавлять в класс поле size. При обращении к этому полю возвращается len() объекта, если объект имеет длину, иначе же abs() объекта, если от него вычисляется модуль, и 0 в противном случае. Если в объекте присвоить этому полю некоторое значение, будет возвращаться это значение до тех пор, пока поле не удалят.
1 @sizer
2 class S(list):
3 pass
4
5 @sizer
6 class N(complex):
7 pass
8
9 @sizer
10 class E(Exception):
11 pass
12
13 for obj in S("QWER"), N(3+4j), E("Exceptions know no lengths!"):
14 print(obj, obj.size)
15 p = S(range(10, 15))
16 print(p.size)
17 p.size = p.pop()
18 print(p.size)
19 del p.size
20 print(p.size)
- Подсказка. Чаще всего (но не всегда) декораторы классов не создают производный класс, а подхакивают имеющийся, и его же возвращают
['Q', 'W', 'E', 'R'] 4 (3+4j) 5.0 Exceptions know no lengths! 0 5 14 4
Спойлер: