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



  • 相关阅读:
    计算机中丢失MSVCP110.dll
    应用程序无法正常启动0xc000007b
    查看80端口被占用
    重装系统后搭建php环境
    修改、设置root密码
    安装虚拟机时出现The Microsoft Runtime DLL
    linux网络配置
    Java拾遗
    哈希中的那些序问题
    笔记本电脑安装jupyterthemes
  • 原文地址:https://www.cnblogs.com/zh-lei/p/8875142.html
Copyright © 2011-2022 走看看