Python裝飾器是一種強大的工具,它允許你在不修改函數代碼的情況下,增加函數的功能。以下是一些關于Python裝飾器的最佳實踐:
裝飾器是一個函數,它接受一個函數作為參數,并返回一個新的函數。裝飾器的基本用法包括日志記錄、性能測試、權限驗證等。
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} finished")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(3, 4)
functools.wraps
保留原函數的信息當使用裝飾器時,原函數的元信息(如函數名、文檔字符串等)可能會丟失。使用functools.wraps
可以保留這些信息。
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
print(f"Hello, {name}!")
greet("World")
帶參數的裝飾器允許你根據傳入的參數動態修改裝飾器的行為。
def repeat_decorator(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat_decorator(3)
def say_hello():
print("Hello!")
say_hello()
類裝飾器是裝飾類的特殊裝飾器,它通過實現__call__
方法來允許類的實例像函數一樣被調用。
class Cache:
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
if args in self.cache:
print("從緩存中獲取結果")
return self.cache[args]
result = self.func(*args)
self.cache[args] = result
return result
@Cache()
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(50))
裝飾器的執行順序是從下往上的,即最內層的裝飾器先執行,然后是外層的裝飾器。
通過遵循這些最佳實踐,你可以更有效地使用Python裝飾器來增強你的代碼功能,同時保持代碼的清晰和可維護性。