zoukankan      html  css  js  c++  java
  • Python自动化装饰器问题解疑

    问题一 到底是怎么执行的?

    import time
    
    
    def timer(timeout=0):
        def decorator(func):
            def wrapper(*args, **kwargs):  # 会给装饰器传递参数,因为无法确定装饰器有多少参数,所以使用这个。
                start = time.time()
                func(*args, **kwargs)
                stop = time.time()
                print('run time is %s ' % (stop - start))
                print(timeout)
    
            return wrapper
    
        return decorator
    
    
    @timer(2)  # 装饰器的参数为2 timer(2)(test)
    def test(list_test):
        for i in list_test:
            time.sleep(0.1)
            print('-' * 20, i)
    
    
    # timer(timeout=10)(test)(range(10))
    test(range(2))
    

    @timer(2) 等价于 test = timer(2)(test)
    执行过程为:
    ①执行timer(2)返回decorator这个函数对象
    ②实际上是decorator(test)返回wrapper函数对象并赋给test,等价于test=wrapper
    最后执行test(range(2))相当于wrapper(test2)

    问题二嵌套函数必须这么写吗?

    装饰器的作用就是在函数调用方法不变的情况下,把此函数包装成另一个函数来使用。

    去掉任何一个嵌套函数都会改变函数的调用方式。

  • 相关阅读:
    数组中重复的数字
    第一个只出现一次的字符位置
    丑数
    字符串的排列
    把数组排成最小的数
    圆圈中最后剩下的数
    同步通信与异步通信
    S3C2440 UART串口驱动
    ARM处理器工作模式
    s3c2440系统时钟
  • 原文地址:https://www.cnblogs.com/wspblog/p/6030050.html
Copyright © 2011-2022 走看看