Вы можете использовать декоратор класса плюс немного магии.
Функции декорации
Предположим, у вас есть декоратор, который просто записывает строку в журнал перед вызовом функции.
def log(func):
def logged_func(*args, **kwargs):
print('logged')
func(*args, **kwargs)
return logged_func
Украшение классов
Можно использовать тот же трюк, но с классом. log_all
это декоратор класса, cls
это тип класса. Мы используем vars
для обхода словаря классов и ищем методы, используя callable(v)
. Украсьте метод с помощью log(v)
и используйте setattr
, чтобы изменить определение cls
на новый оформленный метод. Точно так же, как декораторы функций, возвращайте класс в конце.
def log_all(cls):
for k, v in vars(cls).items():
if callable(v):
setattr(cls, k, log(v))
return cls
Я игнорирую k
по существу, но k
- это имя метода, вы можете использовать его для достижения своего сценария использования.
Полный код
Вот полный пример, который должен иметь определенный смысл.
def log(func):
def logged_func(*args, **kwargs):
print('logged')
func(*args, **kwargs)
return logged_func
def log_all(cls):
for k, v in vars(cls).items():
if callable(v):
setattr(cls, k, log(v))
return cls
@log_all
class A:
def method(self):
pass
Каждый метод в классе A
должен быть украшенс декоратором log
.
>>> a = A()
>>> a.method()
logged