一、定义:

       装饰器实际上是为了给某程序添加功能,但是有的应用程序已经上线或被使用,那么大批量的直接修改源码是不合适的,也是不科学的,于是就产生了装饰器,其满足:

       1、不修改被装饰函数的源代码;

       2、不修改被装饰函数的的执行过程;

       3、在其原来代码的基础上添加新的逻辑判断或处理。

二、不带参数的装饰器:

1、添加打印时间任务:

import time

def stringToUper(func):  # 接收原函数
    def wrap(*args,**kwargs):
        start=time.time()
        func(args)           # 调用原函数
        print(time.time()-start)    # 统计函数运行时间
    return wrap

@stringToUper  # 装饰的函数
def main(lst):
    time.sleep(1)   # 设置休息时间,防止代码运行太快,时间太短。
    for l in lst:  # 循环遍历结果
        print(l)

main('abcdefg')    # 调用函数

2、修改原参数:

import time

def stringToUper(func):
    def wrap(*args,**kwargs):
        start=time.time()
        args=''.join([arg.upper() for arg in args])    # 修改原参数,把参数都改为大写
        func(args)
        print(time.time()-start)
    return wrap

@stringToUper
def main(lst):
    time.sleep(1)
    for l in lst:
        print(l)

main('abcdefg')

三、带参数的装饰器:

1、单个参数的装饰器:

import time

def stringToUper(params):    # 接收参数
    def function(func):
        def wrap(*args,**kwargs):
            start=time.time()
            func(params)   # 利用装饰器将原函数的参数修改为接收的新参数
            print(time.time()-start)
        return wrap
    return function

@stringToUper('hijklmn')    # 传递参数
def main(lst):
    time.sleep(1)
    for l in lst:
        print(l)

main('abcdefg')

2、多个参数的装饰器:

import time

def stringToUper(*params):    # 接收多个参数
    def function(func):
        def wrap(*args,**kwargs):
            start=time.time()  
            for x in (params):    # 遍历多个参数,调用原函数
                func(x)
            print(time.time()-start)
        return wrap
    return function

@stringToUper('www','yyy')   # 传递多个参数
def main(lst):
    time.sleep(1)
    for l in lst:
        print(l)

main('abcdefg')

四、继承多个装饰器

def func1(func):
    print('func1')
    def warp(*args,**kwargs):
        print('func1:main function')
        func(*args,**kwargs)
    return warp

def func2(func):
    print('func2')
    def warp(*args,**kwargs):
        print('func2:main function')
        func(*args,**kwargs)
    return warp

@func1
@func2
def prints():
    print('main function')

prints()

执行流程:

1、事先把所有的函数和变量都定义完,装饰器执行顺序:fun2 ->func1, 函数关联完此时已经打印完了func2、func1。

Python 装饰器

2、当真正执行prints()函数的时候,函数就从里往外执行:func1 ->  func2,故结果为:

Python 装饰器

相关文章: