裝飾器是一種設計模式,起到裝飾的作用。就是在不修改函數代碼的情況下,給函數增加一些功能。
現有一個返回字符串的函數,在不修改該函數的情況下,將返回的字符串轉換為大寫字符串。
def uppercase_decorator(func): # 定義一個函數,其參數func是函數類型參數
def inner(): # 嵌套函數inner
s = func() # 調用func()函數並將返回值賦值給s變量
make_uppercase = s.upper() # 將字符串轉換為大寫並賦值給make_uppercase
return make_uppercase # 結束嵌套函數func()調用,返回轉換之後的字符串
return inner # 結束函數uppercase_decorator()調用, 返回嵌套函數inner
def say_hello():
return 'hello world.'
if __name__=="__main__":
say_hello2 = uppercase_decorator(say_hello) # 調用uppercase_decorator()函數,實參是say_hello()函數,返回值say_hello2變量也是一個函數
print(say_hello2()) # 調用say_hello2函數
Python提供了裝飾器注釋功能,裝飾器本質上是一個函數。
上述代碼使用裝飾器修改如下:
def uppercase_decorator(func):
def inner():
s = func()
make_uppercase = s.upper()
return make_uppercase
return inner
@uppercase_decorator # 使用@uppercase_decorator裝飾器聲明say_hello1()函數
def say_hello1():
return "zhang cheng."
if __name__=="__main__":
print(say_hello1()) # 使用裝飾器不需要顯式調用uppercase_decorator()函數,直接調用say_hello1()函數即可。
一個函數可以有多個裝飾器聲明。
def uppercase_decorator(func): # 將字符串轉換成大寫
def inner():
s = func()
make_uppercase = s.upper()
return make_uppercase
return inner
def backet_decorator(func): # 給字符串添加括號
def inner():
s = func()
make_bracket = '(' + s + ')'
return make_bracket
return inner
@backet_decorator
@uppercase_decorator
def say_hello():
return 'hello world.'
if __name__=="__main__":
print(say_hello())
裝飾器本質上是函數,因此可以給裝飾器傳遞參數。
def calc(func): # 定義裝飾器函數calc(func),其參數還是一個函數
def wrapper(arg1): # 定義嵌套函數wrapper(arg1),這個函數參數列表與裝飾器要注釋的函數參數列表一致
return func(arg1)
return wrapper
@calc
def square(n):
return n * n
@calc
def abs(n):
return n if n > 0 else -n
if __name__=="__main__":
print(f"3's square is {
square(3)}")
print(f"-30's absulate is {
abs(-30)}")