今天才发现装饰器的另一种用法,下面就先上代码:
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)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
代码很简单就是,定义三个foo开头的函数,每个foo函数输出不一样的数字,都通过装饰器data_item进行修饰,最后通过max_item函数,执行一系列逻辑获取结果。
这里有个容易被忽略的点,那就是装饰器实际是在执行 max_item()之前就执行了。
所以,如果你打印下data_list你会发现它是有值的。
[<function foo at 0x10bb05ea0>, <function foo1 at 0x10bb05d90>, <function foo3 at 0x10bb05f28>]
- 1.
即列表里面已经有三个被装饰器修饰的函数了,然后在
max(i() for i in data_list)
- 1.
的i()阶段这三个函数执行了,得到了结果(1,2,3),然后最后取它们的max值即3。
什么场景会用到呢,一般对于传入一个值然后多种处理方案,选择其中优秀方案的时候可以考虑使用这种方法。
emmm,装饰器还是挺有意思的。