裝飾器的原則:
開放封閉原則:對擴充套件是開放的,對修改是封閉的;
裝飾器的作用:
在不改變原函式呼叫的情況下,擴充套件被裝飾函式的功能(可以在裝飾器函式內部,在被裝飾函式的前後分別新增相應的功能);
裝飾器函式的本質:
裝飾器函式本質上就是乙個閉包函式;
裝飾器函式固定模式:
裝飾器函式
def inner(*args):
print("
在被裝飾的函式之前新增的功能
") #
1最先被列印
ret=f(*args) #
被裝飾的函式func帶有返回值
print("
在被裝飾的函式之後新增的功能
") #
3 被列印
return
ret
return
inner
def func(a,b,c): #
被裝飾的函式
print(a,b,c) #
2.執行被裝飾的函式時被列印
return
"哈哈哈哈"#
4.最後返回的結果在全域性中被列印
ret=func(1,2,3)
print(ret)
先介紹乙個函式的功能,就是可以以乙個字串的形式返回乙個函式的函式名 func.__name__ ;
可以返回函式的注釋資訊,就是寫在函式內部功能之前 最開始的注釋 func.__doc__;
def執行結果:func():
'''我是乙個func函式
'''print('
hello')
print(func.__name__,type(func.__name__)) #
以字串的形式返回函式的名
print(func.__doc__) #
返回乙個函式內部注釋
現在我們來看裝飾器固定模式這個**,有乙個很有意思的事:
裝飾器函式
def inner(*args):
print("
在被裝飾的函式之前執行的**")
ret=f()
print("
在被裝飾的函式之後執行的**")
return
ret
return inner #
deffunc(a,b,c):
(a,b,c)
return
"哈哈哈哈
"print(func.__name__)
執行結果:
我們列印func()函式的名字(使用func.__name__ 以字串的形式列印函式名)發現竟然是inner!
我們可以這樣操作:
from functools import也就是from functools import wraps匯入wraps ,然後在裝飾器函式的內部,inner()閉包函式的上方加上 @wraps(f)即可;wraps
def @wraps(f)
def inner(*args):
print("
在被裝飾的函式之前執行的**")
ret=f(*args)
print("
在被裝飾的函式之後執行的**")
return
ret
return
inner
deffunc(a,b):
(a,b)
return
"哈哈哈哈
"print(func.__name__
)print(func(1,2))
matlab cody學習筆記 day12
input n 5 output a is 3 3 3 3 3 3 2 2 2 3 3 2 1 2 3 3 2 2 2 3 3 3 3 3 3 如何生成乙個靶心矩陣。答 function a bullseye n a ceil sqrt spiral n 2 0.5 spiral n 命令生成n維從...
python學習 day12 模組os sys
內容 以下內容僅供個人學習使用,侵刪 usr bin env python coding utf 8 os 通過程式與作業系統做互動 import os 四個維度 重要的 1.資料夾 建立資料夾 os.mkdir,os.makedirs 刪除資料夾 os.rmdir,os.removedirs 檢視...
前端學習Day12
一 定位 1.position static absolute relative 2.position fixed 固定定位 a 參照物 瀏覽器視窗 b 不佔據空間,脫離布局流 3.讓乙個元素在瀏覽器視窗左右上下居中?第一種方法 前提 已知寬和高 position fixed left 50 top...