函式作裝飾器 ,類做裝飾器

2021-09-13 14:46:13 字數 1789 閱讀 5887

"""

用類寫裝飾器

func = decorator(func)

func('abc',18)

"""class decorator(object):

def __init__(self, f):

self.f = f

def __call__(self,*args,**kwargs):

print("decorator start")

self.f(*args,**kwargs)

print("decorator end")

@decorator

def func(name,age):

print("\' is ".format(name,age))

print("func")

func('abc',18)

用函式寫裝飾器

func1 = decorator1(func)

func1('abc',18)

'''@decorator1

def func1(name,age):

print("\' is ".format(name, age))

func1('abc',18)

def decorator1(f):

print("decorator start")

f(*args, **kwargs)

print("decorator end")

@decorator1

def func1(name,age):

print("\' is ".format(name, age))

func1('abc',18)

print("function \'s name is {}".format(func1.__name__))
輸出為:

這是由於裝飾後的func其實相當於 func= decorator1(func) 

而 func.__name ,也相當於decorator1(func) .__name__

消除這種影響的辦法是 使用  functools 工具包中的 wraps 裝飾器

1

from functools import

wraps

2def

decorator1(f):

3@wraps(f)45

print("

decorator start")

6 f(*args, **kwargs)

7print("

decorator end")

8return910

@decorator1

11def

func1(name,age):

12print("

\' is

".format(name, age))

1314 func1('

abc',18)

15print("

function \'s name is {}

".format(func1.__name__))

view code

輸入為:

decorator start

abc' is 18

decorator end

function 's name is func1

消除後顯示正常

posted @

2019-03-12 15:21

藍天008 閱讀(

...)

編輯收藏

函式裝飾器 類裝飾器

一 函式裝飾函式 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.不帶引數裝飾器 此方式...