zoukankan      html  css  js  c++  java
  • 容易被忽视的python装饰器的特性

    今天发现了装饰器的另一种用法,下面就先上代码:

    data_list = []
    
    
    def data_item(func):
        data_list.append(func)
        return func
    
    
    @data_item
    def foo():
        return 1
    
    
    @data_item
    def foo1():
        return 2
    
    
    @data_item
    def foo3():
        return 3
    
    
    def max_item():
        result = max(i() for i in data_list)
        return result
    
    
    if __name__ == '__main__':
        item = max_item()
        print(item)
    

    代码很简单就是,定义三个foo开头的函数,每个foo函数输出不一样的数字,都通过装饰器data_item进行修饰,最后通过max_item函数,执行一系列逻辑获取结果。

    这里有个容易被忽略的点,那就是装饰器实际是在执行 max_item()之前就执行了。
    所以,如果你打印下data_list你会发现它是有值的。

    [<function foo at 0x10bb05ea0>, <function foo1 at 0x10bb05d90>, <function foo3 at 0x10bb05f28>]
    

    即列表里面已经有三个被装饰器修饰的函数了,然后在

     max(i() for i in data_list)
    

    的i()阶段这三个函数执行了,得到了结果(1,2,3),然后最后取它们的max值即3。

    什么场景会用到呢,一般对于传入一个值然后多种处理方案,选择其中最佳方案的时候可以考虑使用这种方法。
    emmm,装饰器还是挺有意思的。

  • 相关阅读:
    kafka消费者问题
    kubernetes
    Grafana+prometheus+AlertManager+钉钉机器人
    kafka汇总
    java实现顺序表、链表、栈 (x)->{持续更新}
    hadoop细节 -> 持续更新
    drf之组件(认证、权限、排序、过滤、分页等)和xadmin、coreapi
    drf之视图类与路由
    drf序列化与反序列化
    drf之接口规范
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11914918.html
Copyright © 2011-2022 走看看