## 裝飾器
* [參考](https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000)
>[info] #### 獲取函數名稱
* 函數對象有一個__name__屬性,可以拿到函數的名字:
~~~
>>> now.__name__
'now'
>>> f.__name__
'now'
~~~
>[info] #### 打印日志
~~~
def log(func):
def wrapper(*args, **kw):
print 'call %s():' % func.__name__
return func(*args, **kw)
return wrapper
~~~
~~~
@log
def now():
print '2013-12-25'
~~~
~~~
>>> now()
call now():
2013-12-25
把@log放到now()函數的定義處,相當于執行了語句:
now = log(now)
~~~
>[info] 高級的日志
~~~
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
~~~
~~~
@log('execute')
def now():
print '2013-12-25'
和兩層嵌套的decorator相比,3層嵌套的效果是這樣的:
>>> now = log('execute')(now)
~~~
~~~
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return wrapper
return decorator
~~~