成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 裝飾器使用:八個裝飾器的巧妙應用

開發
裝飾器是Python中一種強大的工具,今天,我們將通過十個實用的裝飾器應用,從基礎到進階,一步步揭開它的面紗。

裝飾器是Python中一種強大的工具,它們可以讓你修改或增強函數、方法甚至類的行為,就像是給你的代碼披上一層魔法斗篷。今天,我們將通過10個實用的裝飾器應用,從基礎到進階,一步步揭開它的面紗。

1. 簡單的時間統計裝飾器

目的:計算函數執行時間,了解性能。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.4f} seconds")
        return result
    return wrapper

@timing_decorator
def example_function(n):
    sum(range(n))

example_function(1000000)

解釋:這個裝飾器記錄了被裝飾函數的開始和結束時間,然后計算并打印出耗時。它使用了*args 和 **kwargs 來保持函數的通用性。

2. 參數驗證裝飾器

用途:確保函數輸入參數滿足特定條件。

def positive_number_decorator(func):
    def wrapper(number):
        if number < 0:
            raise ValueError("Number must be positive.")
        return func(number)
    return wrapper

@positive_number_decorator
def square(number):
    return number ** 2

try:
    print(square(-5))
except ValueError as e:
    print(e)

技巧:通過拋出異常來處理不滿足條件的情況,保持函數接口的清晰。

3. 緩存裝飾器

目的:提高效率,避免重復計算。

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n <= 1:
       return n
    else:
       return (fibonacci(n-1) + fibonacci(n-2))

print(fibonacci(30))  # 只計算一次

注意:lru_cache是一個內置的緩存實現,非常適合用于耗時的計算任務。

4. 日志記錄裝飾器

用途:自動記錄函數調用信息。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned: {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

add(5, 3)

技巧:這有助于調試和監控程序運行。

5. 類方法裝飾器

場景:在類方法上添加額外邏輯。

def class_method_logger(cls_method):
    def wrapper(self, *args, **kwargs):
        print(f"Calling method '{cls_method.__name__}' on {self.__class__.__name__}")
        return cls_method(self, *args, **kwargs)
    return wrapper

class MyClass:
    @class_method_logger
    def say_hello(self, name):
        print(f"Hello, {name}")

MyClass().say_hello("World")

理解:裝飾器同樣適用于類方法,增加類行為的靈活性。

6. 異常處理裝飾器

目的:統一異常處理邏輯。

def handle_exceptions(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"Error in {func.__name__}: {e}")
    return wrapper

@handle_exceptions
def divide(a, b):
    return a / b

divide(10, 0)  # 安全地處理除零錯誤

7. 計數裝飾器

應用場景:跟蹤函數調用次數。

class Counter:
    def __init__(self, func):
        self.func = func
        self.calls = 0

    def __call__(self, *args, **kwargs):
        self.calls += 1
        print(f"Call {self.calls} of {self.func.__name__}")
        return self.func(*args, **kwargs)

@Counter
def greet():
    print("Hello!")

greet()
greet()

8. 參數默認值檢查裝飾器

使用:確保函數參數符合預期值。

def check_parameters(expected):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for key, value in kwargs.items():
                if key in expected and value != expected[key]:
                    raise ValueError(f"Invalid value for {key}. Expected {expected[key]}, got {value}.")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@check_parameters({"difficulty": "easy"})
def start_game(difficulty):
    print(f"Starting game with difficulty level {difficulty}.")

start_game(difficulty="medium")  # 觸發異常

實戰案例:Web請求計時與日志記錄

假設我們有一個簡單的Web請求函數,我們想要記錄每次請求的時間并簡單記錄日志。

import requests
from datetime import datetime

def request_logger(url):
    def decorator(func):
        def wrapper(*args, **kwargs):
            start = datetime.now()
            response = func(url, *args, **kwargs)
            end = datetime.now()
            print(f"Request to {url} completed in {end - start}. Status Code: {response.status_code}")
            return response
        return wrapper
    return decorator

@request_logger("https://api.example.com/data")
def make_request(url):
    return requests.get(url)

make_request()

分析:這個案例展示了如何結合使用多個功能(計時和日志記錄)于一個裝飾器中,以監控API調用。在實際開發中,這樣的裝飾器可以極大地幫助監控和優化服務性能。

通過上述示例,我們不僅掌握了裝飾器的基礎和進階應用,還學會了如何根據實際需求設計和實現裝飾器,以增強代碼的功能性和可維護性。

責任編輯:趙寧寧 來源: PythonAI與圖像處理
相關推薦

2024-09-23 09:00:00

裝飾器函數代碼

2024-03-08 08:00:00

Python開發裝飾器

2022-09-21 13:32:39

Python裝飾器

2010-02-01 17:50:32

Python裝飾器

2024-05-21 10:40:09

開發前端裝飾器

2016-11-01 09:24:38

Python裝飾器

2023-02-07 07:47:52

Python裝飾器函數

2021-09-27 10:03:55

裝飾器代碼

2022-06-15 10:24:13

Pytho裝飾器代碼

2022-09-14 08:16:48

裝飾器模式對象

2024-05-24 11:36:28

Python裝飾器

2022-09-19 23:04:08

Python裝飾器語言

2024-11-09 08:26:52

Python裝飾器

2025-04-14 08:35:00

Python類裝飾器裝飾器

2021-06-01 07:19:58

Python函數裝飾器

2021-04-11 08:21:20

Python@property裝飾器

2025-01-22 15:58:46

2020-04-13 16:05:25

JS裝飾器前端

2024-02-26 00:00:00

TypeScript裝飾器decorators

2009-12-25 18:12:43

WPF裝飾器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久国产 | 国产精品精品视频一区二区三区 | 亚洲国产一区二区三区 | 亚洲黄色一级毛片 | 成人国产午夜在线观看 | 国产区一区二区三区 | 国产免费视频 | av入口 | 极品在线 | 国产精品日韩欧美 | 国产成人一区二区三区电影 | 国产成人精品一区二区 | 色在线免费视频 | 精品一区二区三区在线视频 | 国产乱码精品一区二区三区忘忧草 | 国产欧美精品一区二区 | 欧美一级黑人aaaaaaa做受 | 99热热热热| 精品一区二区三区入口 | 日韩av在线免费 | 国产精品久久久久久中文字 | 一二区视频 | 黄色网址免费看 | 欧美精品久久久久 | 亚洲欧美日本国产 | 中文字幕一区二区三区乱码图片 | 在线日韩福利 | 一区二区视频在线观看 | 羞视频在线观看 | 久久久久久国产精品免费 | 亚洲免费一区二区 | 国产香蕉视频 | 国产美女一区二区 | 91综合在线视频 | 青青草免费在线视频 | 四季久久免费一区二区三区四区 | 免费观看av | 亚洲一区二区三区国产 | 国产精品视频播放 | 国产精品久久久久一区二区 | 国产色婷婷精品综合在线手机播放 |