裝飾器:本質上是個函數,在不改變原函數代碼的狀況下爲函數添加功能閉包
裝飾器實際上就是一個閉包函數函數
經常使用於:權限驗證,用戶登錄註冊學習
裝飾器分類:普通裝飾器spa
裝飾帶有參數的函數(定長,不定長)ci
裝飾帶有返回值的函數it
帶有參數的裝飾器(不一樣函數不一樣效果)權限
把類做爲裝飾器(後面講)語法
裝飾類(後面講)方法
普通裝飾器方法1裝飾器
def xdl(func): #裝飾器
def inner(): #是將來裝飾後的函數
print('上學打卡')
func() #func是原函數,是bj_work函數,sh_work函數
print('放學打卡')
return inner
#北京的打卡函數 (原函數)
def bj_work():
print('開始北京的一天學習')
bj_work=xdl(bj_work) #bi_work函數==inner函數
bj_work()
#上海的打卡時間
def sh_work():
print('開始上海的一天學習')
sh_work=xdl(sh_work)
sh_work()
會輸出:
上學打卡
開始北京的一天學習
放學打卡
上學打卡
開始上海的一天學習
放學打卡
普通裝飾器方法2
@語法:加上@系統會自動把下面的函數當成參數傳遞到裝飾器中,從下到上
@符又被稱爲語法糖
def xdl(func): #裝飾器
def inner(): #是將來裝飾後的函數
print('上學打卡')
func() #func是原函數,是hz_work函數
print('放學打卡')
return inner
@xdl
def hz_work():
print('開始杭州的一天學習')
hz_work()
會輸出:
上學打卡
開始杭州的一天學習
放學打卡
加上@系統會自動把下面的函數當成參數傳遞到裝飾器中,從下到上
def out_1(func):
def inner():
print('開始打卡1')
func()
print('放學打卡1')
return inner
def out_2(func):
def inner():
print('開始打卡2')
func()
print('放學打卡2')
return inner
@out_1
@out_2
def xqgz():
print('開始各個小區的一天學習')
xqgz()
會輸出:
開始打卡1
開始打卡2
開始各個小區的一天學習
放學打卡2
放學打卡1
#帶有參數(定長)的裝飾器 inner()中的參數必定要與func()中的參數同樣,能夠不跟sz_work()中的參數同樣
def xdl(func):
def inner(n,s):
print('上學打卡')
func(n,s)
print('放學打卡')
return inner
@xdl
def sz_work(name,sex):
print('開始深圳的一天學習')
sz_work('深圳','城市')
會輸出:
上學打卡
開始深圳的一天學習
放學打卡
#帶有參數(不定長)的裝飾器 inner()中的參數必定要與func()中的參數同樣,能夠不跟sz_work()中的參數同樣
def xdl(func):
def inner(*a,**k):
print('上學打卡')
func(*a,**k)
print('放學打卡')
return inner
@xdl
def sz_work(*arge,**kwargs):
print(arge,kwargs,'開始深圳的一天學習')
sz_work('深圳','城市',waihao='世界之窗')
會輸出:
上學打卡
('深圳', '城市') {'waihao': '世界之窗'} 開始深圳的一天學習
放學打卡
#帶有返回值的裝飾器
def xdl(func):
def inner():
print('開始打卡')
zhuangtai=func()
print('放學打卡')
return zhuangtai
return inner
@xdl
def work():
print('開始工做')
return '工做結束'
res=work()
print(res)
會輸出:
開始打卡
開始工做
放學打卡
工做結束
帶有參數的裝飾器(不一樣函數有不一樣效果)
def wai_out(city):#只是一個殼子 def out(func): #真實的裝飾器 def inner(): if city=='上海': print('開始打卡') func() print('放學打卡') elif city=='北京': print('北京不上課') return inner return out@wai_out('上海')def sh_work(): print('開始上海一天的學習')sh_work()print('===============')@wai_out('北京')def bj_work(): print('開始北京一天的學習')bj_work()