天天看點

簡單講講python裝飾器

裝飾器其實是閉包的一種,如果有重複功能需要實作的話,裝飾器是個不錯的選擇。比如每個函數需要添加一個提示開始的功能:

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!