Python中的裝飾器是一種高級編程技巧,通過它我們可以在不改變原有函數的基礎上,在其前后添加一些額外的邏輯。這使得我們可以很方便地擴展原有代碼的功能,更好地實現代碼重用和維護。
一個裝飾器本質上就是一個函數,它接受一個函數作為參數,并返回一個新函數。新函數實現了對原有函數的裝飾(即添加了額外的邏輯)。
@decorator
def func():
# do something
在裝飾器的語法糖@decorator后緊跟著要裝飾的函數func,在函數定義之前。這樣,當我們在調用func()時,實際上會調用裝飾后的新函數。
在使用裝飾器時,需要注意一些細節:
def my_decorator(func):
def wrapper():
# do something before func() is called
func()
# do something after func() is called
return wrapper
@my_decorator
def say_hello():
print("Hello World!")
say_hello()
裝飾器函數的參數是被裝飾的函數,返回值是一個新函數。在新函數中,可以在被裝飾的函數執行前后添加額外的邏輯。在上述示例中,my_decorator是一個裝飾器函數,它的參數func是一個函數,返回值wrapper也是一個函數。在wrapper函數中,我們在原有的say_hello函數前后添加了額外的邏輯,這樣當我們調用say_hello函數時,實際上會調用裝飾后的新函數wrapper。
除了使用函數實現裝飾器外,我們還可以使用類來實現裝飾器。
class my_decorator(object):
def __init__(self, func):
self.func = func
def __call__(self):
# do something before self.func() is called
self.func()
# do something after self.func() is called
@my_decorator
def say_hello():
print("Hello World!")
say_hello()
在使用類實現裝飾器時,我們需要實現__init__和__call__方法。__init__方法初始化裝飾器,__call__方法實現裝飾器的邏輯。在上述示例中,my_decorator是一個裝飾器類,它的__init__方法初始化了被裝飾的函數,__call__方法實現了在原有函數前后添加額外邏輯的功能。在調用say_hello函數時,實際上會調用my_decorator的__call__方法。
Python裝飾器的應用是廣泛的,它可以幫助我們實現緩存、日志、權限控制等功能。Python自帶的functools庫還提供了一些實用的裝飾器,例如lru_cache、wraps等。在實際開發中,裝飾器是一個必不可少的工具。