完善裝飾器函式

2021-07-23 11:07:55 字數 1159 閱讀 2014

@decorator可以動態實現函式功能的增加,但是,經過@decorator「改造」後的函式,和原函式相比,除了功能多一點外,有沒有其

它不同的地方?

(1)、在沒有decorator的情況下,列印函式名

**:

def f1(x):

pass

print f1.__name__

輸出:

(2)、有decorator的情況下,再列印函式名

**:

def log(f):

print 'call...'

return f(*args, **kw)

@log

def f2(x):

pass

print f2.__name__

輸出:

發現什麼,哎函式名改變了,這不是我們希望看到的。

decorator還改變了函式的__doc__等其它屬性。

(3)、decorator的改造

如果要讓呼叫者看不出乙個函式經過了@decorator的「改造」,就需要把原函式的一些屬性複製到新函式中。

**:

def log(f):

print 'call...'

return f(*args, **kw)

@log

def f2(x):

pass

print f2.__name__

輸出:

這樣寫decorator很不方便,因為我們也很難把原函式的所有必要屬性都乙個乙個複製到新函式上,所以python內建的functools可

以用來自動化完成這個「複製」的任務:

**:

import functools

def log(f):

@functools.wraps(f)

print 'call...'

return f(*args, **kw)

@log

def f2(x):

pass

print f2.__name__

輸出:

裝飾器基本上告一段落了,以後有用到其他的深入再來學習!

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...