Не используя inspect, я сделаю это так:
import types
def trace(cls):
for attr_name in cls.__dict__:
attr = getattr(cls, attr_name)
if isinstance(attr, types.MethodType):
setattr(cls, attr_name, log(attr))
return cls
EDIT:
Ваше ограничение немного странно, но давайте посмотрим:
Мы можем заменить if isinstance(attr, types.MethodType)
на if callable(attr)
, что даст нам только вызываемый атрибут класса, который включает также статические методы и методы класса ...
Мы также можем сделать, так как другой ответ предлагает использовать if hasattr(attr, 'im_func')
, это исключит статические методы.
Если мы тоже хотим исключить метод класса (только метод экземпляра), я думаю, что единственное решение, о котором я сейчас знаю (без импорта другого модуля), - это изменение декоратора, чтобы проверить, является ли первый аргумент классом или экземпляр, это может дать вам подсказку, если метод, который будет оформлен, является классом или методом экземпляра.
Надеюсь, это поможет:)