Так, я можу дати вам схему, але мій Python трохи іржавий, і я занадто зайнятий, щоб детально пояснювати.
В основному, вам потрібно вставити проксі в метод, який буде викликати оригінал, наприклад:
class fred(object):
def blog(self):
print "We Blog"
class methCallLogger(object):
def __init__(self, meth):
self.meth = meth
def __call__(self, code=None):
self.meth()
f = fred()
f.blog = methCallLogger(f.blog)
Ця відповідь StackOverflow про виклик може допомогти вам зрозуміти вищезазначене.
Більш докладно:
Хоча відповідь була прийнята, завдяки цікавій дискусії з Гленом і маючи кілька хвилин вільного часу, я хотів розширити свою відповідь:
class methCallLogger(object):
def __init__(self, meth):
self.meth = meth
self.was_called = False
def __call__(self, code=None):
self.meth()
self.was_called = True
class fred(object):
def blog(self):
print "We Blog"
f = fred()
g = fred()
f.blog = methCallLogger(f.blog)
g.blog = methCallLogger(g.blog)
f.blog()
assert(f.blog.was_called)
assert(not g.blog.was_called)