你可能不知道的Python裝飾器
今天才發(fā)現(xiàn)裝飾器的另一種用法,下面就先上代碼:
- 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開頭的函數(shù),每個foo函數(shù)輸出不一樣的數(shù)字,都通過裝飾器data_item進(jìn)行修飾,最后通過max_item函數(shù),執(zhí)行一系列邏輯獲取結(jié)果。
這里有個容易被忽略的點,那就是裝飾器實際是在執(zhí)行 max_item()之前就執(zhí)行了。
所以,如果你打印下data_list你會發(fā)現(xiàn)它是有值的。
- [<function foo at 0x10bb05ea0>, <function foo1 at 0x10bb05d90>, <function foo3 at 0x10bb05f28>]
即列表里面已經(jīng)有三個被裝飾器修飾的函數(shù)了,然后在
- max(i() for i in data_list)
的i()階段這三個函數(shù)執(zhí)行了,得到了結(jié)果(1,2,3),然后最后取它們的max值即3。
什么場景會用到呢,一般對于傳入一個值然后多種處理方案,選擇其中優(yōu)秀方案的時候可以考慮使用這種方法。
emmm,裝飾器還是挺有意思的。