Написать класс Absolute, который можно использовать как метакласс. Absolute добавляет в порождаемый класс дескриптор abs и метод __abs__(). При создании класса ему можно передавать два именных параметра: width — имя поля «ширина» и height — имя поля «высота». По умолчанию width="width" и height="height". Создание полей abs и __abs__ происходит по следующим правилам (правила применяются по принципу «первое подходящее»):
Если метод __abs__() существует, он не меняется; если это не метод — поле заменяется на метод
Если существует метод abs() и этот метод допускает вызов без параметров, то __abs__() должен делать то же самое
Если существует метод __len__() и этот метод допускает вызов без параметров, то __abs__() должен делать то же самое
Если существуют методы «ширина»() и «высота»() и они допускают вызов без параметров, то __abs__() возвращает их произведение
Если в классе существуют не-callable поля «ширина» и «высота», то __abs__() возвращает их произведение
В противном случае __abs__() возвращает сам объект без изменений
Дескриптор abs создаётся всегда (в том числе вместо любого атрибута abs, если он был): возвращает __abs__().
Подсказка: немного упростило жизнь from collections.abc import Callable
…и getfullargspec(), конечно
2 64
