你可能不知道的Python裝飾器
作者:陳祥安
你可能不知道的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,裝飾器還是挺有意思的。
責任編輯:華軒
來源:
Python學習開發