python 裝飾器的基本原理
阿新 • • 發佈:2018-12-10
#裝飾器的本質 就是函式,功能是為其他函式新增附加功能 #原則: # 不修改被修飾函式的原始碼,不修改被修飾函式的呼叫方式 # import time # def cal(l): # start_time=time.time() # res=0 # for i in l: # time .sleep(0.1) # res+=i # stop_time=time.time() # print('函式的執行時間是%s'%(stop_time-start_time)) # return res # print(cal(range(100))) #裝飾器=高階函式+函式巢狀+閉包 import time def foo(): time.sleep(0.2) print('彭亮') #不修改原始碼 不修改foo呼叫方式 def timer (func): start_time=time.time() func() stop_time=time.time() print('執行時間%s'%(stop_time-start_time)) return func foo=timer(foo) foo()
#裝飾器本身就是函式 # 裝飾器就是閉包函式的一種應用場景 # 二 什麼是裝飾器 # # 裝飾器他人的器具,本身可以是任意可呼叫物件,被裝飾者也可以是任意可呼叫物件。 # 強調裝飾器的原則:1 不修改被裝飾物件的原始碼 2 不修改被裝飾物件的呼叫方式 # 裝飾器的目標:在遵循1和2的前提下,為被裝飾物件新增上新功能 def deco(obj): print('===========',obj) obj.x=1 obj.y=2 obj.z=3 return obj ### @deco是全域性變數 # @deco # 裝飾器的原理就是 運行了deco 目的是:test=deco(test) deco把test傳入進去同時得到一個(返回值 傳給func) 再賦給test # def test(): # print('test函式執行') # print("+"*20) # @deco #就是相當於 Foo=deco(Foo) # class Foo: # pass # print(Foo.__dict__) # @ 不僅可以在函式前面加 還可以在類前面加 print("-------------------"*30) # @deco def test(): # 一切皆物件 test 也是物件 print('test') test.x=1 test.y=2 print(test.__dict__)