Есть несколько проблем с вашей программой; вместо того, чтобы вдаваться во все детали, я укажу способ получить желаемый результат.
Ошибка возникает из-за того, что вы переопределили метод what
в TestClass
, который теперь принимает единственный аргумент cls
, который может быть чем угодно. Другими словами, вам также необходимо украсить ваш метод класса в подклассе с помощью декоратора classmethod
.
Если вы хотите сохранить текущий код, вам нужно предоставить аргумент cls
точно, что-то вроде следующего должно сделать:
from functools import partial
def class_decorator(cls):
for attr_name in vars(cls):
attr_value = getattr(cls, attr_name)
if callable(attr_value): # check if attr is a function
if attr_name == 'what':
setattr(cls, attr_name, partial(ball(attr_value), cls=cls))
else:
setattr(cls, attr_name, ball(attr_value))
с использованием partial
для передачи класса в качестве первого аргумента.
Кроме того, я использовал vars(cls)
, чтобы получить cls.__dict__
, поскольку dir
выполняет рекурсию по базам (чего вы здесь не хотите). Кроме того, вместо проверки атрибута __call__
используйте callable
.