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

    1. 装饰器

    # 无参装饰器,这里的参数是指在使用装饰器的时候的参数
    import functools
    def wrapper(func):
        @functools.wraps(func)
        def inner(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            end_time = time.time()
            print(end_time - start_time)
            return res
        return inner
    
    # 无参装饰器的使用
    @wrapper
    def func():
        pass
    
    
    # 有参装饰器
    def auth(driver):
        def wrapper(func):
            ...
        return wrapper
    
    
    # 有参装饰器的使用
    @auth(driver='file')
    def func():
        pass

    2. 装饰器推导

    import time
    
    
    def func():
        pass
    
    
    # 步骤一:将计时器功能封装成一个函数
    def inner(func):
        start_time = time.time()
        res = func()
        end_time = time.time()
        print(end_time - start_time)
        return res
    
    # 此时调用方式(inner(函数名)),改变了函数名()的调用放啊
    
    
    # 步骤二:在函数外面再包一层函数,返回一个函数名,用此函数名加括号来调用函数。函数的参数在内层函数传入
    def wrapper(func):
        def inner(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            end_time = time.time()
            print(end_time - start_time)
            return res
        return inner
    
    
    # 此时函数的调用方式分两步
    func = wrapper(func)  # 步骤一
    func()  # 步骤二
    
    
    # 此时如果调用方法
    a = func.__doc__  # 是inner的注释
    b = func.__name__  # 方法名是inner
    # 解决方法,加一个functools.wraps(func)
    
    # 最终写法
    import functools
    def wrapper(func):
        @functools.wraps(func)
        def inner(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            end_time = time.time()
            print(end_time - start_time)
            return res
        return inner
    
    
    
    # 语法糖,写在函数上方,自动调用func = wrapper(func)
    @wrapper
    def func():
        pass
  • 相关阅读:
    zookeeper
    redis客户端高低版本简单实战、雪崩、击穿、穿透、布隆过滤器(三)
    redis集群理论与实战(二)
    redis集群理论与实战
    oracle单表循环修改表字段
    redis的集群、主从复制、CAP、paxos
    CF1328D Carousel
    AT4842 [ABC136E] Max GCD
    [ABC135D] Digits Parade
    AT4752 [ABC131E] Friendships
  • 原文地址:https://www.cnblogs.com/JackShi/p/13152543.html
Copyright © 2011-2022 走看看