¿Mejor forma de registrar llamadas de método en Python?

Podemos codificar algún tipo de decorador de registro para hacer eco de llamadas de función / método como las siguientes:

def log(fn):
    ...

@log
def foo():
    ...

class Foo(object):
    @log
    def foo(self):
        ...

    @log
    def bar(self, a, b):
        ...

    @log
    def foobar(self, x, y, z):
        ...

Pero, ¿qué pasa si queremos registrar llamadas de método sin poner tantos @log delante de cada definición de metanfetamina? ¿Hay alguna manera de poner un decorador encima de una definición de clase para hacer que todas sus llamadas a métodos sean decoradas / registradas? ¿O hay otras formas mejores e interesantes de hacerlo en lugar de decorador?

Respuestas a la pregunta(4)

Su respuesta a la pregunta