Поймать события «до / после вызова функции» для всех функций в классе

Есть ли возможность перехватывать события «до / после вызова функции» для всех функций в классе, не декорируя каждую из этих функций? Может быть, какой-то класс декоратор? Другими словами, для такого кода я хотел бы получить следующий вывод:

class Foo:
    def func1():
        print('1')

    def func2():
        print('2')

c = Foo()
c.func1()
c.func2()

# Output I would like to get:
# func1 called
# 1
# func1 finished
# func2 called
# 2
# func2 finished

Мне это нужно не для отслеживания. В классе, работающем с асинхронными функциями, мне нужно знать, была ли вызвана какая-либо функция до того, как другая функция была завершена.

Ответы на вопрос(2)

Ваш ответ на вопрос