1、装饰器原理
def w1(func):
def inner():
print('---正在验证权限----')
func()
return inner
def f1():
print('-----f1-----')
def f2():
print('----f2-----')
#innerfunc = w1(f1)
#innerfunc()
f1 = w1(f1)
f1()
2、装饰器语法
def w1(func):
def inner():
print('---正在验证权限----')
func()
return inner
@w1 #在func代表的函数身上添加@
def f1():
print('-----f1-----')
def f2():
print('----f2-----')
f1()
3、装饰器执行的时间
装饰器在Python解释器执行的时候,就会进行自动装饰,并不是在在执行的时候才进行装饰
4、两个装饰器
def w1(func):
print('---正在装饰 1----')
def inner():
print('---正在验证权限 1----')
func()
return inner
def w2(func):
print('---正在装饰 2----')
def inner():
print('---正在验证权限 2----')
func()
return inner
@w1 #f1 = w1(f1)
@w2 #f1 = w2(f1)
def f1():
print('-----f1-----')
#在调用f1之前,已经进行了装饰
f1()
说明:
如果不调用f1,直接编译,打印结果是:
---正在装饰 2----
---正在装饰 1----
如果调用f1,打印结果是
---正在装饰 2----
---正在装饰 1----
---正在验证权限 1----
---正在验证权限 2----
-----f1-----
理解:
@w1 #f1 = w1(f1)
@w2 #f1 = w2(f1)
def f1():
当解释器程序执行这个的时候,先碰到@w1所以判断下面是否是def函数,发现下面是@w2,所以继续执行,当碰到def f1()的时候,找到要装饰的目标函数,所以先用w2对目标进行装饰,然后用w1对目标函数进行装饰
5、装饰器对有参和无参的函数进行装饰
1、有参
def func(funNume):
def func_in(aa,bb):
funNume(aa,bb)
return func_in
@func
def f1(a,b):
print("------ppppp-----")
f1(11,12)
2、对有返回值的函数进行装饰
def func(funNume):
def func_in(aa,bb):
return funNume(aa,bb)
return func_in
@func
def f1(a,b):
print("------ppppp-----")
return ‘haha’
f1(11,12)
6 、通用装饰器
def func(funNume):
def func_in(*args,**kargs):
return funNume(*args,**kargs)
return func_in
@func
def f1(a,b):
print("------f1-----")
return 'haha'
@func
def f2():
print("----f2-----")
@func
def f3(a):
print("----f3-----")
#说明:*args,**kargs是不定参数
7、带参数的装饰器
def func_arg(arg = 'hello'):
def func(funNume):
def func_in(*args,**kargs):
return funNume(*args,**kargs)
return func_in
return func
#1.先执行func_arg('world')函数,这个函数return的结果是func这个函数的引用
#2.@func
#3.使用@func对f1进行装饰
@func_arg('world')
def f1(a,b):
print("------f1-----")
return 'haha'