我在python中實現了一個RESTful web服務,並希望通過攔截函數調用並記錄它們的執行時間等來添加一些QOS日誌記錄功能。Python中的攔截方法調用
基本上我想到了一個其他所有服務都可以繼承的類,它自動覆蓋默認的方法實現並將它們包裝在一個記錄器函數中。達到此目的的最佳方式是什麼?
我在python中實現了一個RESTful web服務,並希望通過攔截函數調用並記錄它們的執行時間等來添加一些QOS日誌記錄功能。Python中的攔截方法調用
基本上我想到了一個其他所有服務都可以繼承的類,它自動覆蓋默認的方法實現並將它們包裝在一個記錄器函數中。達到此目的的最佳方式是什麼?
像這樣的東西?這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
如果你在每個函數上寫一個裝飾器會怎樣?以下是python's wiki的示例。
你使用任何web框架來做你的web服務嗎?或者你是否親手做了一切?
這是更明確,非神奇的做事方式。 – 2010-04-24 13:23:40
這是一個例子,瞭解它是如何工作的。根據定義的例子不是神奇的 – dzen 2010-04-24 17:08:16
這段代碼有點奇怪,如果'attr'沒有'__call__'屬性(順便說一下,它有點不同於不可調用),這會給出一個'NameError'而不是返回屬性。另外,'attr .__ call __(* args,** kwargs)'通常拼寫爲'attr(* args,** kwargs)'。 – 2010-04-24 13:28:12
完美,正是我所需要的。我做了類似的事情,但在初始化方法,並以某種方式搞砸了,但你的方法就像一個魅力。謝謝。 – 2010-04-24 13:34:07
@Mike:的確,如果忘記了else子句。我混合python2.6和3 btw,因此不使用可調用的內置。 3,我真的不知道更直接的方法來檢查這一點。 – KillianDS 2010-04-24 13:38:08