装饰器decorator

  • 什么时候用装饰器
    想要给函数动态的增加一些额外的功能。
    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。
  • 不加@wraps(func),函数的名字就是wrapper
  • 加@wraps(func),可以保留被装饰前的函数名
  1. 外层函数嵌套内层函数
  2. 外层函数返回内层函数
  3. 内层函数要使用外层函数传递的参数

调用函数,如果带括号,那么是调用函数运行后的结果,
调用函数不带括号,调用的是函数本身

"""__author__= 雍新有"""
import random
import time
from functools import wraps


def record_time(func):
    
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__}执行时间: {end - start}秒')
        return result

    return wrapper


@record_time
def download(filename):
    print(f'开始下载{filename}')
    time.sleep(random.randint(5, 15))
    print(f'{filename}下载完成')


@record_time
def upload(filename):
    print(f'开始上传{filename}')
    time.sleep(random.randint(5, 15))
    print(f'{filename}上传完成')


def main():
    print(download.__name__)
    print(upload.__name__)
    download('Python从入门到住院.pdf')
    upload('苍老师.avi')
    download.__wrapped__('Python从入门到住院.pdf')
    upload.__wrapped__('苍老师.avi')


if __name__ == '__main__':
    main()
"""
download
upload
开始下载Python从入门到住院.pdf
Python从入门到住院.pdf下载完成
download执行时间: 8.000381231307983秒
开始上传苍老师.avi
苍老师.avi上传完成
upload执行时间: 13.00049352645874秒
开始下载Python从入门到住院.pdf
Python从入门到住院.pdf下载完成
开始上传苍老师.avi
苍老师.avi上传完成
"""
+ 装饰器在Django中就是中间件middleware
# record_time是一个装饰器函数(装饰别的函数或者类的函数)
# 装饰器函数可以用来装饰一个类或函数
# 如果装饰器用来装饰函数那么他的参数就是被装饰的函数(func)
def record_time(func):
    # 装饰器中内嵌的wrapper函数是带装饰功能的函数
    # 它除了要执行被装饰的函数之外要执行额外的代码
    def wrapper(*args, **kwargs):
        #  在执行被装饰的函数之前要做什么

        result = func(*args, **kwargs)
        #  在执行被装饰的函数之后要做什么

        return result

    return wrapper()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 许多面向对象都有decorator(装饰器)函数,比如python中也可以用decorator函数来强化代码...
    ITgecko阅读 12,579评论 0 0
  • 一、背景最近在看activemq的时候,无意看到其web操作页面的结构框架很有意思,刚开始有点懵,但仔细摸索半天并...
    笑才阅读 5,765评论 0 0
  • 一直没理解Decorator的作用,但最近在很多框架和库中看到它的身影,尤其是React和Redux,还有mobx...
    cbw100阅读 22,594评论 2 31
  • 友之女,正花季,眼望春色将来至。东风恶,欢情薄,一脚油门,阴阳两隔,可恨罪人肇事逃逸,错!错!错! 天...
    新新唐王阅读 2,405评论 0 3
  • 昨晚后半夜下起了久违的大雨,早晨刮起了狂风,暴雨如注、狂风怒吼,一幅天翻地覆的景象。下午一切变得平静,老天爷也累了...
    26c0acdcc586阅读 1,885评论 0 5