装饰器本质上是一个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()