def deco(attr): ''' 裝飾器,共包含三層返回結構 \n 第一層:用於接收 @deco 的參數,此處的代碼只在初始化裝飾器時執行一次 \n 第二層:用於接收 function,此處的代碼只在初始化裝飾器時執行一次 \n 第三層:用於接收 function 的參數,並將做爲最終被執行與返回的裝飾結果 \n ''' def _deco(f): '''第二層:用於接收 function,此處的代碼只在初始化裝飾器時執行一次 ''' print('只在裝飾函數時,執行一次,此時裝飾函數', f.__name__) def __deco(a, b): '''第三層:用於接收 function 的參數,並將做爲最終被執行與返回的裝飾結果 ''' print('before run attr: ' + attr + '; a: ' + a + '; b: ' + b) # 此處必須調用 function,否則裝飾器執行事後,就不會再執行 function 的函數體 f(a, b) print('after run attr: ' + attr + '; a: ' + a + '; b: ' + b) return __deco return _deco @deco('hello') def hello(a, b): print('hello, ' + a + b) @deco('world') def world(a, b): print('world, ' + a + b) hello('a', 'b') world('A', 'B') # 執行結果: # # 只在裝飾函數時,執行一次,此時裝飾函數 hello # 只在裝飾函數時,執行一次,此時裝飾函數 world # before run attr: hello; a: a; b: b # hello, ab # after run attr: hello; a: a; b: b # before run attr: world; a: A; b: B # world, AB # after run attr: world; a: A; b: B