# 定义一个函数,参数为函数名,内部再创建一个函数
def zwai(func):
zwai = 1
print("我是函数zwai创建的变量|zwai=",zwai)
# 创建内部函数
def znei():
print("我是内部函数znei,获取外部函数变量|zwai=",zwai)
# 返回作为参数传入的参数,装饰器用法,要有小括号
return func()
# 外部函数返回内部函数,形成闭包,闭包语法内部函数不加小括号
return znei
# 定义一个函数使用作为参数传入装饰器 zwai
def targ():
targ = 2
print("我是目标函数targ,我创建的变量|targ= ",targ)
# 将目标函数传入装饰器函数
# 一个括号,返回值是znei,也就是闭包
zwai(targ)
# 两个括号,闭包执行,闭包返回值函数执行
zwai(targ)()
# 以上就完成了原始的装饰器
# python的装饰器语法 @zwai 将装饰器语法用在定义目标函数前,就实现了将函数作为参数传入装饰器函数的效果
# 在调用函数的时候,直接调用目标函数,不用再写装饰器函数
print("<><><>")
# 使用装饰器语法
@zwai
def tarc():
tarc = 3
print("我是装饰器语法 @函数,传入的函数tarc,我创建的变量|tarc =",tarc)
tarc()
目标函数需要传参的装饰器语法
def zwai(func):
# 目标函数有参数,其参数放在装饰器内部函数的参数中传入
def znei(var1,var2):
print("被装饰了")
# 调用的时候要加入参数
return func(var1,var2)
return znei
@zwai
def tar(a,b):
return a+b
print(tar(2,3))
装饰器需要参数的语法
# 最外层函数,其参数是装饰器自有参数
def wai(arg):
# 中层函数,其参数就是要被装饰的目标函数
def zhong(func):
# 内层函数,其参数是目标函数所需的参数
def nei(var):
# 内层函数返回被装饰函数的调用
return func(var)
# 中层函返回内层函数
return nei
# 外层函数返回中层函数
return zhong
# 目标函数使用装饰器
@wai(arg)
def fuc(var):
pass
装饰器和目标函数都有参数的实例
def wai(arg):
def zhong(func):
def nei(var):
if arg >= 0:
return func(var)
else:
return func(var+100)
return nei
return zhong
# ss = 2
ss = -3
#用装饰器的参数实现了控制函调用返回值
@wai(ss)
def func(a):
return a
print(func(20))