2010-04-24 146 views
35

我在python中实现了一个RESTful web服务,并希望通过拦截函数调用并记录它们的执行时间等来添加一些QOS日志记录功能。Python中的拦截方法调用

基本上我想到了一个其他所有服务都可以继承的类,它自动覆盖默认的方法实现并将它们包装在一个记录器函数中。达到此目的的最佳方式是什么?

回答

43

像这样的东西?这implictly增加了一个装饰你的方法(你也可以在此基础上明确的装饰,如果你更喜欢):

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 
+0

这段代码有点奇怪,如果'attr'没有'__call__'属性(顺便说一下,它有点不同于不可调用),这会给出一个'NameError'而不是返回属性。另外,'attr .__ call __(* args,** kwargs)'通常拼写为'attr(* args,** kwargs)'。 – 2010-04-24 13:28:12

+0

完美,正是我所需要的。我做了类似的事情,但在初始化方法,并以某种方式搞砸了,但你的方法就像一个魅力。谢谢。 – 2010-04-24 13:34:07

+0

@Mike:的确,如果忘记了else子句。我混合python2.6和3 btw,因此不使用可调用的内置。 3,我真的不知道更直接的方法来检查这一点。 – KillianDS 2010-04-24 13:38:08

4

如果你在每个函数上写一个装饰器会怎样?以下是python's wiki的示例。

你使用任何web框架来做你的web服务吗?或者你是否亲手做了一切?

+3

这是更明确,非神奇的做事方式。 – 2010-04-24 13:23:40

+2

这是一个例子,了解它是如何工作的。根据定义的例子不是神奇的 – dzen 2010-04-24 17:08:16