Я думаю, это то, что вы просите.
In [8]: from functools import wraps
...: results = []
...: instances = []
...:
...: class A:
...: def __init__(self, data):
...: self.data = data
...:
...: def decorator(f):
...: @wraps(f)
...: def inner(*args, **kwargs):
...: retval = f(*args, **kwargs)
...: results.append(retval)
...: return retval
...: return inner
...:
...:
...: @decorator
...: def f1(self, a, b):
...: return self.data + a + b
...:
...: @decorator
...: def f2(self, a):
...: return self.data + a + 1
...:
In [9]: a = A(3)
In [10]: a.f1(2,3)
Out[10]: 8
In [11]: results
Out[11]: [8]
Декоратор не обязательно должен быть в классе, но это удобно, когда вам нужен доступ к самому экземпляру класса. Вы можете взять его без изменения кода.
In [8]: from functools import wraps
...: results = []
...: instances = []
...: def decorator(f):
...: @wraps(f)
...: def inner(*args, **kwargs):
...: retval = f(*args, **kwargs)
...: results.append(retval)
...: return retval
...: return inner
...:
...: class A:
...: def __init__(self, data):
...: self.data = data
...:
...:
...:
...: @decorator
...: def f1(self, a, b):
...: return self.data + a + b
...:
...: @decorator
...: def f2(self, a):
...: return self.data + a + 1
...:
In [9]: a = A(3)
In [10]: a.f1(2,3)
Out[10]: 8
In [11]: results
Out[11]: [8]
будет работать так же.