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



  • 相关阅读:
    skywalking物理拓扑图
    检测HTTPS证书到期时间
    docker zipkin 链路监控
    定时任务和任务-示例
    小程序列表循环出来的list是不同接口赋的值
    小程序编辑器报-50003错误肿么办?
    uni-app小程序组建
    2019
    春日
    Mac安装软件提示破损
  • 原文地址:https://www.cnblogs.com/zh-lei/p/8875142.html
Copyright © 2011-2022 走看看