@Gys

Как сделать метод, который вызывается при вызове любого другого метода?

Допустим есть класс:
class A:
    def b(self):
        print("bbb")
    def c(self):
        print("ccc")

Чтобы сделать функцию, которая вызывается при вызове b() или c() можно сделать декоратор
Например так:
class A:
    def dec(func):
        def wrapper(self):
            print("wrapper")
            func(self)
        return wrapper
    @dec
    def b(self):
        print("bbb")
    @dec
    def c(self):
        print("ccc")

И все будет работать.
Но что, если в классе А не 2 метода, а 10-15?
А мне надо, чтобы dec() вызывалось при вызове любого другого метода.
Конечно, можно к каждому новому методу приписывать декоратор @dec, но выглядит это не очень.
Можно ли как-то сделать так, чтобы это работало нормально? Чтобы не приходилось приписывать декоратор к каждому новому методу?
Если в питоне такое не сделать, то есть ли такая возможность в каких-то других языках?
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
@twistfire92
Python backend developer
Можно использовать декоратор для класса

def wrapper(method):
    def comment(*args, **kwargs):
        method(*args, **kwargs)
        print('wrapper')
    return comment


def wrap_all_methods(cls):
    class NewCls:
        def __init__(self, *args, **kwargs):
            self._obj = cls(*args, **kwargs)

        def __getattribute__(self, s):
            try:
                x = super().__getattribute__(s)
            except AttributeError:
                pass
            else:
                return x

            attr = self._obj.__getattribute__(s)
            
            if isinstance(attr, type(self.__init__)):
                return wrapper(attr)

            else:
                return attr

    return NewCls

@wrap_all_methods
class A:
    def b(self):
        print("bbb")

    def c(self):
        print("ccc")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 июн. 2024, в 15:12
15000 руб./за проект
29 июн. 2024, в 15:03
15000 руб./за проект
29 июн. 2024, в 14:48
1000 руб./за проект