1. 程式人生 > >使用類來寫裝飾器

使用類來寫裝飾器

mon main ext end cti wrap 計算 nbsp them

前兩天發現了裝飾器可以直接使用類來寫,分享一下,需要用類裏面的__call__方法,__call__方法就是可以把這個實例當成一個函數來調用,如果正常使用類裏面的方法的話,實例方法要先實例化類,然後才能調用,靜態方法、類方法則需要用類名或者實例化之後的對象來調用,而實例化之後的這個對象,是不能被調用的,__call__方法就是把這個實例變成一個可以調用的對象,也就是說實例化之後,這個對象就可以和一個普通函數一樣被調用。

示例代碼如下:

1 2 3 4 5 6 7 8 9 class Foo: def __call__(self, *args, **kwargs):
print(‘call....‘) def test(self):# print(‘test....‘) if __name__ == ‘__main__‘: t = Foo()#實例化類 t.test()#正常調用實例方法 t()#直接調用實例化之後的對象

運行結果:

1 2 >>>test.... #這個是調用test方法的時候輸出的 >>>call....#這個是執行調用這個實例化之後的方法輸出的

理解了上面的之後,就可以使用class來寫一個裝飾器了,計算程序的運行時間,當然思想和以前用函數寫裝飾器是一樣的

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Fuck(object): def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): import time start_time = time.time() res = self.func(*args, **kwargs) end_time = time.time() print(‘the function "%s" run time is %s‘ % (self.func.__name__,
(end_time - start_time))) return res @Fuck def run(name): import time time.sleep(1) return ‘sb_%s‘ % name print(run(‘hyf‘))

運行結果:

1 2 >>>the function "run" run time is 1.0001001358032227#這個是裝飾器幫我們計算的函數運行時間 >>>sb_hyf#這個是正常運行run函數的時候,返回的值

使用類來寫裝飾器