Python裝飾器是一種高級技術,它可以使得代碼更加優雅和簡潔。裝飾器是Python中一個特殊的函數,它可以包裝另一個函數,并添加一些附加的功能,但不修改原始函數的代碼。
裝飾器通常被用來為應用程序添加功能,如緩存、日志記錄、性能分析、輸入驗證等。例如,當一個函數需要被頻繁調用時,可以在裝飾器中添加緩存代碼,以避免重復計算。
def memoize(func): cache = {} def wrapper(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrapper @memoize def fibonacci(n): if n<= 1: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(10))
在上面的代碼中,我們使用裝飾器“@memoize”來緩存函數的結果。當我們調用“fibonacci(10)”時,它首先檢查緩存中是否有結果,如果沒有,就執行原始函數的代碼,然后把結果存到緩存中。下一次調用時,它就可以直接從緩存中獲取結果,避免了重復計算。
裝飾器不僅可以在函數級別上使用,還可以在類級別上使用。例如,一個web框架可以使用裝飾器來實現路由映射。下面是一個使用裝飾器的示例:
class MyApp: def __init__(self): self.routes = {} def route(self, path): def wrapper(func): self.routes[path] = func return wrapper def handle_request(self, path): handler = self.routes.get(path) if handler: return handler() return "404 Not Found" app = MyApp() @app.route("/") def index(): return "Hello, World!" @app.route("/about") def about(): return "About us" print(app.handle_request("/")) print(app.handle_request("/about"))
在上面的代碼中,我們定義了一個裝飾器“@app.route”,它可以把一個函數映射到一個URL路徑。當我們調用“app.handle_request”時,它會根據URL路徑尋找相應的處理函數,如果找到了就執行它。
總之,Python裝飾器為我們提供了一種簡潔而強大的方式來為代碼添加額外的功能,同時還能保持代碼的簡潔和可讀性。