装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动
的前提下增加额外功能,装饰器的返回值也是一个函数对象。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
#encoding=utf-8
#使用装饰器对无参的函数进行装饰
def w1(func):
def inner():
print("正在验证需要验证的东西")
func()
return inner
#只要python解释器执行到了这行代码,就进行装饰了而不是等到调用的时候才装饰
@w1 #等价于temp = w1(s1), 然后执行temp()
def s1():
print("---s1---")
@w1
def s2():
print("---s2---")
s1()
s2()
#使用装饰器对带参数个数确定的函数进行装饰
def func1(functionName):
print("func1")
def func_in(a, b):
print("func_in")
functionName(a,b)
return func_in
@func1
def z1(a,b):
print("---test--- a = %d, b = %d"%(a, b))
z1(10,20)
print("\n")
#使用装饰器对带参数个数不确定的函数进行装饰
def func1(functionName):
print("func1")
def func_in(*args, **kwargs):
print("func_in")
functionName(*args, **kwargs)
return func_in
@func1
def z1(a, b):
print("---test--- a = %d, b = %d"%(a, b))
@func1
def z2(a, b, c):
print("---test--- a = %d, b = %d, c = %d"%(a, b, c))
z1(10, 20)
z2(10,20,30)
print("\n")
#使用装饰器对有返回值的函数进行装饰
def func1(functionName):
print("func1")
def func_in(*args, **kwargs):
print("func_in")
xxx = functionName(*args, **kwargs) #使用变量保存原来函数中要返回的值
return xxx #返回
return func_in
@func1
def z1(a, b):
print("---test--- a = %d, b = %d"%(a, b))
return "hello"
@func1
def z2(a, b, c):
print("---test--- a = %d, b = %d, c = %d"%(a, b, c))
return " world!"
a1 = z1(10, 20)
a2 = z2(10,20,30)
print(a1 + a2)
print("\n")
#使用通用的装饰器对函数进行装饰
def func1(functionName):
def func_in(*args, **kwargs):
xxx = functionName(*args, **kwargs) #使用变量保存原来函数中要返回的值
return xxx #返回
return func_in
@func1
def z1(a, b):
print("---test--- a = %d, b = %d"%(a, b))
return "hello"
@func1
def z2(a, b, c):
print("---test--- a = %d, b = %d, c = %d"%(a, b, c))
return " world!"
a1 = z1(10, 20)
a2 = z2(10,20,30)
print(a1 + a2)
#带有参数的装饰器
print("\n")
def func_arg(arg):
def func(functionsName):
def func_in(*args, **kwargs):
print("---测试---%s"%(arg))
xxx = functionsName()
return xxx
return func_in
return func
#1:先执行 func_arg("haha")函数,这个函数return的结果是func这个函数的引用
#2:执行 @func
@func_arg("haha")
def AAA():
print("AAA---test")
AAA()