裝飾器其實是閉包的一種,如果有重複功能需要實作的話,裝飾器是個不錯的選擇。比如每個函數需要添加一個提示開始的功能:
def start(func):
def wrapper():
print("Now function {} starts!".format(func.__name__))
return func()
return wrapper
def greet():
print("Hello, everyone!")
def morning():
print("Good Morning!")
greet = start(greet)
greet()
morning = start(morning)
morning()
複制
我們需要這兩個函數的開始的提醒,這樣寫可以避免在greet和morning函數中重複的寫
print("Now function {} starts!".format(func.__name__))
複制
這句話,不過這樣寫還可以進一步省略,即:
def start(func):
def wrapper():
print("Now function {} starts!".format(func.__name__))
return func()
return wrapper
@start
def greet():
print("Hello, everyone!")
@start
def morning():
print("Good Morning!")
greet()
morning()
複制
如果function需要參數的話可以用*args和**kwargs:
def start(func):
def wrapper(*args, **kwargs):
print("Now function {} starts!".format(func.__name__))
return func(*args, **kwargs)
return wrapper
@start
def greet(name):
print("Hello, {}!".format(name))
@start
def morning(name):
print("Good Morning, {}!".format(name))
greet('Kura')
morning('Kura')
複制
傳回:
Now function greet starts!
Hello, Kura!
Now function morning starts!
Good Morning, Kura!