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)

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

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

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

  • 相关阅读:
    其他魔术方法
    类型约束和类的魔术常量
    PHP对象遍历、内置标准类与数据转对象
    类的自动加载与对象的克隆
    PHP重载与接口
    面向对象
    PHP基础
    地下城与勇士的项目整理
    mysql建表
    jQuery
  • 原文地址:https://www.cnblogs.com/wspblog/p/6030050.html
Copyright © 2011-2022 走看看