在Python中拦截方法调用
我正在用Python实现一个RESTful网络服务,想要增加一些质量服务(QOS)日志功能,通过拦截函数调用来记录它们的执行时间等等。
简单来说,我想设计一个类,让所有其他服务都可以从这个类继承,这个类会自动覆盖默认的方法实现,并把它们包裹在一个日志记录的函数里。请问有什么好的方法来实现这个呢?
2 个回答
6
如果你给每个函数都写一个装饰器会怎么样呢?这里有一个例子,可以在Python的维基百科上找到。
你在做网络服务的时候,有使用任何网络框架吗?还是说你都是手动完成所有的工作?
73
像这样吗?这实际上是在你的方法上隐式地添加了一个装饰器(如果你更喜欢的话,也可以基于这个创建一个显式的装饰器):
class Foo(object):
def __getattribute__(self,name):
attr = object.__getattribute__(self, name)
if hasattr(attr, '__call__'):
def newfunc(*args, **kwargs):
print('before calling %s' %attr.__name__)
result = attr(*args, **kwargs)
print('done calling %s' %attr.__name__)
return result
return newfunc
else:
return attr
现在当你尝试类似这样的代码时:
class Bar(Foo):
def myFunc(self, data):
print("myFunc: %s"% data)
bar = Bar()
bar.myFunc(5)
你会得到:
before calling myFunc
myFunc: 5
done calling myFunc