什麼是裝飾器python
開放封閉原則閉包
軟件一旦上線後,就應該遵循開放封閉原則。對修改源代碼是粉筆的,對功能的拓展是開放的也就是說咱們必須找到一種解決方案:可以在不修改一個功能源代碼以及調用方式的前提下,爲其加上新功能app
總結函數
原則以下對象
1.不修改源代碼blog
2.不修改調用方式內存
目的class
在1和2元則的基礎上拓展新功能import
什麼是裝飾器基礎
裝飾器即在不修改被裝飾對象源代碼與調用方式的前提下,爲裝飾器對象添加新功能
裝飾器與被裝飾的對象都可以是任意調用的對象
裝飾器=>函數
被裝飾的對象=>函數
語法糖
被裝飾函數的正上方,單獨一行 @deco1 def foo(): pass foo=deco1()
並且語法糖的前後順序也會影響代碼執行結果
# import time 引入time庫#定義了一個閉包函數(最高嵌套3層) # def timer(func):# 函數內部包含一個函數,且引用函數內部的變量即閉包函數,閉包函數從自身所在名稱空間出發尋找變量,找不到就跳出本層找,直到找到內置名稱空間 # def wrapper(*args,**kwargs):# *args和**kwargs保證了能接收任何參數# 代碼塊 # start_time = time.time() # res=func(*args,**kwargs) #調用最原始的index# 上面接收什麼,這裏就會接收什麼 # stop_time = time.time() # print('run time %s' % (stop_time - start_time)) # return res #這個是幹嗎的,只知道是返回最原始的index # return wrapper #返回的是wrapper函數名對應的內存地址,能夠加()直接調用 # # @timer #語法糖,至關於index=timer(index) # def index(): # time.sleep(一、 # print('welcome to index page') # return 123 # @timer # def home(name): # time.sleep(2) # print('welcome %s to index page' %name) # # index() # home('egon')