1.對擴充套件是開放的
為什麼要對擴充套件開放呢?
我們說,任何乙個程式,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許**擴充套件、新增新功能。
2.對修改是封閉的
為什麼要對修改封閉呢?
就像我們剛剛提到的,因為我們寫的乙個函式,很有可能已經交付給其他人使用了,如果這個時候我們對其進行了修改,很有可能影響其他已經在使用該函式的使用者。
裝飾器完美的遵循了這個開放封閉原則。
def f1(*args,**kwargs): 接收函式的時候,*是聚合
print(*args) 執行函式值,*是打散
print(f1.__doc__)獲取函式的說明資訊
print(f1.__name__)獲取函式的名字
裝飾器已經非常完美了,但是有時我們正常情況下檢視函式資訊的方法在此處都會失效:
def如何解決呢?1index():
'''這是乙個主頁資訊
'''print('
from index')
print(index.__doc__) #
檢視函式注釋的方法 ##這是乙個主頁資訊
print(index.__name__) #
檢視函式名的方法 ##index
from functools import
wraps
2哈哈哈哈3def
deco(func):
4 @wraps(func) #
加在最內層函式正上方56
return func(*args,**kwargs)
7return89
@deco
10def
index():
11'''
哈哈哈哈
'''12
print('
from index')
1314
print(index.__doc__)15
print(index.__name__)
'''
index
'''帶引數的裝飾器:
flag = true #多個裝飾器裝飾乙個函式:fun = f帶引數的裝飾器
defouter(f):
deftimmer(func):
def inner(*args,**kwargs):
iff:
print('''
執行函式之前要做的
''')
ret = func(*args,**kwargs)
iff:
print('''
執行函式之後要做的
''')
return
ret
return
inner
return
timmer
@outer(flag)
#等價於@timmer
deffunc():
print(111)
func()
'''執行函式之前要做的
111執行函式之後要做的
'''
Python高階函式 裝飾器
由於函式也是乙個物件,而且函式物件可能被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2018 4 11 f now f 2018 4 11 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...
Python 高階函式 裝飾器
裝飾器 定義裝飾器本身是乙個可呼叫物件,接收乙個函式作為引數,然後將其返回或替換成另乙個函式或可呼叫物件。可以理解成,原來那是一堵白牆,經過了一層裝飾,這層裝飾可能是漆也可能把牆掏空鑲進一層 變得金光閃閃,最後呈現在你眼前的就是裝飾後的樣子。可以把它完全當成常規函式來呼叫,其引數是另乙個函式。裝飾器...
PYTHON高階函式和裝飾器
定義 裝飾器的本質是函式,用來裝飾其他的函式,為其他的函式新增功能。函式修飾符 用做函式的修飾符,可以在模組或者類的定義層內對函式進行修飾,出現在函式定義的前一行,不允許和函式定義在同一行乙個修飾符就是乙個函式,它將被修飾的函式作為引數,並返回修飾後的同名函式或其他可呼叫的東西 原則 1 不能修改被...