Capture eventos de "llamada a la función antes / después" para todas las funciones en clase

¿Existe alguna posibilidad de capturar eventos de "llamada de función antes / después" para todas las funciones en clase, sin decorar cada una de estas funciones? Puede ser un decorador de clase? En otras palabras, para dicho código, me gustaría obtener el siguiente resultado:

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

No lo necesito para rastrear. En clase trabajando con funciones asincrónicas, necesito saber si se llamó a alguna función antes de que se terminara otra función.

Respuestas a la pregunta(2)

Su respuesta a la pregunta