本文是一篇讀書筆記,寫於一年多前。原文為: 本文只是對其中基礎和重要部分的選取與簡化。
1. 函式decorator的本質:
@one_decorator
def func():
pass
# 相當於
func = one_deacorator(func)
舉例:
def hello(fn):
print "hello, %s" % fn.__name__
fn()
print "goodbye, %s" % fn.__name__
@hello
def foo():
print "i am foo"
原先的foo函式被hello這個decorator包裹(wrap)了一層了。
故多個decorator其實是如下的轉換:
@decorator_one
@decorator_two
def func():
pass
# 相當於
func = decorator_one(decorator_two(func))
2. 帶引數的decorator:
@decorator(arg1, arg2)
def func():
pass
相當於 func = decorator(arg1,arg2)(func)
注意:這裡因為decorator(arg1,arg2)返回的是乙個類似函式指標的東西,也就是乙個函式,所以func就作為了這個函式的引數了。
3. class式的decorator
class mydecorator(object):
def __init__(self, fn):
print "inside mydecorator.__init__()"
self.fn = fn
def __call__(self):
self.fn()
print "inside mydecorator.__call__()"
@mydecorator
def afunction():
print "inside afunction()"
print "finished decorating afunction()"
afunction()
輸出:
inside mydecorator.__init__()
finished decorating afunction()
inside afunction()
inside mydecorator.__call__()
4. decorator的***
所以,python的functools包中提供了乙個叫wraps的decorator來消除這樣的***。
wraps的作用就是把原函式的函式名等屬性傳遞給decorator函式。
from functools import wraps
def hello(fn):
@wraps(fn)
print "hello, %s" % fn.__name__
fn()
print "goodbye, %s" % fn.__name__
@hello
def foo():
'''foo help doc'''
print "i am foo"
pass
foo()
print foo.__name__ #輸出 foo
print foo.__doc__ #輸出 foo help doc
5. 經典的例子
給函式呼叫做快取:
from functools import wraps
def memo(fn):
cache = {}
miss = object()
@wraps(fn)
result = cache.get(args, miss)
if result is miss:
result = fn(*args)
cache[args] = result
else:
print "hit cache! - %s" % args
return result
@memo
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
執行結果如下:
>>> execfile("1.py")
>>> fib(10)
hit cache! - 1
hit cache! - 2
hit cache! - 3
hit cache! - 4
hit cache! - 5
hit cache! - 6
hit cache! - 7
hit cache! - 8
55>>> fib(10)
hit cache! - 10
55>>> fib(8)
hit cache! - 8
21
python中的裝飾器
其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...
Python 中的裝飾器
1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...
python中的 裝飾器
示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...