EDIT
Благодаря вашему комментарию, я думаю, что знаю, в чем проблема. Это не работает:
class A:
@timings
@classmethod
def a(cls, x):
print(x)
A.a(2)
именно по той причине, что вы сказали.
TypeError: необязательный метод wrapper () должен вызываться с экземпляром A в качестве первого аргумента (вместо этого он получает экземпляр int)
Но это так:
class A:
@classmethod
@timings
def a(cls, x):
print(x)
A.a(2)
Так что порядок имеет значение. Я думаю, что здесь происходит то, что он обманывает способ, которым python обрабатывает связанные методы: когда python смотрит на член a, он должен принять решение:
- Сделайте связанный метод
- Создать метод класса
- Ничего не делать (оставить все как есть)
Если он получает обычную функцию, он выполняет (1), а @timings создает обычную функцию.
Решает ли это проблему?