zoukankan      html  css  js  c++  java
  • 装饰器

    1、什么是装饰器?

    #在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证

    2、装饰器的形成过程

    # 需求写一个函数测试另一个函数的执行效率
    最初的实现方式,但是改变了函数的调用方式,需要改进
    def timer(f1):
        start_time = time.time()
        f1()
        end_time = time.time()
        print(end_time- start_time)
    
    timer(func1)
    改进后调用方式基本相似,但是多加了两行代码
    
    def timer(f1):
        start_time = time.time()
        f1()
        end_time = time.time()
        print(end_time- start_time)
    
    f = func1
    func1 = timer
    func1(f)  #== timer(func1)
    最优的方法
    def timer(f1):
        def inner():
            start_time = time.time()
            f1()
            end_time = time.time()
            print(end_time - start_time)
        return inner
    func1 = timer(func1) #做下关系转换
    func1()
    通过python提供的语法塘实现装饰器
    def timer(f1):
        def inner():
            start_time = time.time()
            f1()
            end_time = time.time()
            print(end_time - start_time)
        return inner
    
    @timer   == func1 = timer(func1)
    def func1():
        print("晚上回去吃烧烤")
        time.sleep(0.3)
    @timer  == func2 = timer(func2)
    def func2():  
        print("晚上回去和啤酒")
        time.sleep(0.3)
    func1()
    func2()
    # 装饰器传参
    def timer(f1):
        def inner(*args, **kwargs):
            start_time = time.time()
            f1(*args, **kwargs)
            end_time = time.time()
            print(end_time - start_time)
        return inner
    
    @timer   #== func1 = timer(func1)
    def func1(a, b):
        print("晚上回去吃烧烤")
        time.sleep(0.3)
    @timer  #== func2 = timer(func2)
    def func2(a, b):
        print("晚上回去和啤酒")
        time.sleep(0.3)
    
    func1(111,222)  #参数首先传到inner()函数 *args,然后在传到f1()函数中
    func2(222,333)
    # 函数返回值
    def timer(f1):
        def inner(*args, **kwargs):
            start_time = time.time()
            ret = f1(*args, **kwargs)
            end_time = time.time()
            print(end_time - start_time)
            return ret
        return inner
    
    @timer   #== func1 = timer(func1)
    def func1(a, b):
        print("晚上回去吃烧烤")
        time.sleep(0.3)
        return 666
    ret = func1(1, 2)
    print(ret)
    装饰器的写法规范
    def wrapper(f1):
        def inner(*args, **kwargs):
            执行函数之前的操作
            ret = f1() #返回值
            执行函数之后的操作
            return ret
        return inner



  • 相关阅读:
    此查询使用的不是 ANSI 外部联接运算符
    centos重启命令
    updatePanel 加载完成后回调JS
    建站推荐十个免费的CMS内容管理系统(Php+mysql)
    [转]最值得拥有的免费Bootstrap后台管理模板
    Got a packet bigger than 'max_allowed_packet' bytes”
    ECshop商城程序常见的96个小问题汇总
    linux 命令
    mysql 存储过程
    千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记
  • 原文地址:https://www.cnblogs.com/zh-lei/p/8875142.html
Copyright © 2011-2022 走看看