2010-04-24 145 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