带函数的装饰器、多个装饰器装饰一个函数

一、带参数的装饰器;------开关

__author__ = 'Administrator'
F=True
def outer(F):
    def wap(fun):#gg
        def inner(*args,**kwargs):
            if F:
                print("inner   before")
                ret=fun(*args,**kwargs)#gg()
                print("inner   after")
            else:
                ret=fun(*args,**kwargs)
            return  ret
        return inner
    return wap

@outer(F) #先执行out(F) ----@wap----->gg=wap(gg)
def gg():
    print("gg............")
gg()#inner()

二、多个装饰器装饰一个函数

__author__ = 'Administrator'
def yn(fun):#fun=sc_inner
    def yn_inner(*args,**kwargs):
        print("yun..........before")
        ret=fun(*args,**kwargs)#sc_inner()
        print("yn...........after")
        return ret
    return yn_inner

def sx(fun):#fun=china
    def sx_inner(*args,**kwargs):
        print("sx..........before")
        ret=fun(*args,**kwargs)#china()
        print("sx...........after")
        return ret
    return sx_inner

@yn #china=yn(china)-----china=yn(sx(china))----china=yn(sx_inner)---->china=yn_ineer
@sx  #china=sx(china)----china=
def china():
    print("china is good ")

china()#yn_inner()

三、装饰器的一个应用

l = []
def wrapper(func):
    l.append(func)  #统计当前程序中有多少个函数被装饰了
    def inner(*args,**kwargs):
        #l.append(func)  #统计本次程序执行有多少个带这个装饰器的函数被调用了
        ret = func(*args,**kwargs)
        return ret
    return inner

@wrapper  #f1 = wrapper(f1)
def f1():
    print('in f1')

@wrapper #f2 = wrapper(f2)
def f2():
    print('in f2')

@wrapper #f2 = wrapper(f2)
def f3():
    print('in f3')
print(l)
原文地址:https://www.cnblogs.com/ctztake/p/7257721.html