理解
按照我的理解,其实装饰器就是把当前函数替换成装饰函数,然后再把当前函数当成参数传给装饰函数。
#定义装饰函数
def log(func):
#*args,**kw用来传递未知参数
def wrap(*args,**kw): #func.__name__表面打印程序名称
print("begin:%s()" % func.__name__) #在程序运行前打印开始
ret = func(*args,**kw)
print("end:%s()" % func.__name__) #在程序运行结束后打印结束
return ret #最后返回程序的运行结果
return wrap #返回函数
@log #表示对该函数进行装饰
def test():
print("hello world")
test() #调用被装饰过后的函数
运行结果
begin:test()
hello world
end:test()
另外一种情况
这里我将演示装饰器带参数,以及如何给被装饰的函数传参
理解起来不难,因为test上的装饰器有参数了,所以优先把参数传给装饰器的最顶层函数,其次在把test函数传给下一层函数。
#定义封装函数
def log(text):#最顶层函数
def decorator(func):
#*args,**kw用来传递未知参数
def wrap(*args,**kw): #func.__name__表面打印程序名称
print("%s begin:%s()"%(text , func.__name__)) #在程序运行前打印开始
ret = func(*args,**kw)
print("%s end:%s()" %(text ,func.__name__)) #在程序运行结束后打印结束
return ret #最后返回程序的运行结果
return wrap #返回第二层函数
return decorator#返回第一层函数
@log("python") #表示对该函数进行装饰
def test(content):
print(content)
test("hello world") #调用被装饰过后的函数
运行结果
python begin:test()
hello world
python end:test()