精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從零到精通:Python 裝飾器的完整指南與實戰應用

開發
本文將從基礎原理出發,逐步深入裝飾器的各種應用場景,幫助你真正掌握這項強大的工具。

裝飾器是Python中最優雅卻最容易被誤解的特性之一。許多初學者對"裝飾"這個概念感到困惑,高級開發者則可能陷入過度使用裝飾器的陷阱。本文將從基礎原理出發,逐步深入裝飾器的各種應用場景,幫助你真正掌握這項強大的工具。

一、裝飾器的本質原理

1. 什么是裝飾器

裝飾器本質上是一個函數,它接收另一個函數作為參數,并返回一個新函數。這個新函數通常會在原函數執行前后進行某些操作。

# 最簡單的裝飾器
defmy_decorator(func):
    defwrapper():
        print("執行前")
        func()
        print("執行后")
    return wrapper

@my_decorator
defsay_hello():
    print("Hello!")

# 等同于:say_hello = my_decorator(say_hello)

say_hello()
# 輸出:
# 執行前
# Hello!
# 執行后

2. 保留原函數的元數據

使用裝飾器后,原函數的元數據(如函數名、文檔字符串)會丟失。使用functools.wraps可以解決這個問題。

from functools import wraps

defmy_decorator(func):
    @wraps(func)
    defwrapper(*args, **kwargs):
        """這是wrapper函數"""
        print("執行前")
        result = func(*args, **kwargs)
        print("執行后")
        return result
    return wrapper

@my_decorator
defadd(a, b):
    """將兩個數相加"""
    return a + b

print(add.__name__)  # 'add',而不是'wrapper'
print(add.__doc__)  # '將兩個數相加'

二、裝飾器的常見應用場景

1. 性能監測裝飾器

import time
from functools import wraps

deftimeit(func):
    @wraps(func)
    defwrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 耗時:{end - start:.4f}秒")
        return result
    return wrapper

@timeit
defslow_function():
    time.sleep(1)
    return"完成"

result = slow_function()

2. 日志記錄裝飾器

import logging
from functools import wraps

deflog_calls(level=logging.INFO):
    defdecorator(func):
        @wraps(func)
        defwrapper(*args, **kwargs):
            logging.log(level, f"調用 {func.__name__} 參數:{args}, {kwargs}")
            result = func(*args, **kwargs)
            logging.log(level, f"{func.__name__} 返回值:{result}")
            return result
        return wrapper
    return decorator

@log_calls(level=logging.DEBUG)
defprocess_data(data):
    return data.upper()

process_data("hello")

3. 函數參數驗證裝飾器

from functools import wraps

defvalidate_types(**type_checks):
    defdecorator(func):
        @wraps(func)
        defwrapper(*args, **kwargs):
            for arg_name, expected_type in type_checks.items():
                if arg_name in kwargs:
                    ifnot isinstance(kwargs[arg_name], expected_type):
                        raise TypeError(f"{arg_name} 必須是 {expected_type}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@validate_types(name=str, age=int)
defcreate_user(name, age):
    returnf"創建用戶:{name}, 年齡:{age}"

create_user(name="Alice", age=25)  # 正常
# create_user(name="Alice", age="25")  # 會拋出TypeError

4. 緩存裝飾器(Memoization)

from functools import wraps, lru_cache

# 簡單的緩存實現
defcache(func):
    cached_data = {}
    
    @wraps(func)
    defwrapper(*args):
        if args notin cached_data:
            cached_data[args] = func(*args)
        return cached_data[args]
    
    wrapper.cache = cached_data
    return wrapper

@cache
deffibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# 使用內置的lru_cache
@lru_cache(maxsize=128)
deffibonacci_builtin(n):
    if n < 2:
        return n
    return fibonacci_builtin(n-1) + fibonacci_builtin(n-2)

print(fibonacci(30))  # 快速計算
print(fibonacci.cache)  # 查看緩存

5. 重試裝飾器

from functools import wraps
import time
import random

defretry(max_attempts=3, delay=1, backoff=2):
    defdecorator(func):
        @wraps(func)
        defwrapper(*args, **kwargs):
            current_delay = delay
            last_exception = None
            
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    last_exception = e
                    if attempt < max_attempts - 1:
                        print(f"嘗試 {attempt + 1} 失敗,{current_delay}秒后重試...")
                        time.sleep(current_delay)
                        current_delay *= backoff
            
            raise last_exception
        
        return wrapper
    return decorator

@retry(max_attempts=3, delay=1, backoff=2)
defunstable_api_call():
    if random.random() < 0.7:
        raise Exception("API調用失敗")
    return"成功"

result = unstable_api_call()

6. 權限驗證裝飾器

from functools import wraps

defrequire_permission(*required_perms):
    defdecorator(func):
        @wraps(func)
        defwrapper(user, *args, **kwargs):
            ifnot hasattr(user, 'permissions'):
                raise PermissionError("用戶無權限屬性")
            
            user_perms = set(user.permissions)
            required = set(required_perms)
            
            ifnot required.issubset(user_perms):
                raise PermissionError(f"用戶缺少權限:{required - user_perms}")
            
            return func(user, *args, **kwargs)
        
        return wrapper
    return decorator

classUser:
    def__init__(self, name, permissions):
        self.name = name
        self.permissions = permissions

@require_permission('admin', 'delete')
defdelete_user(user, user_id):
    returnf"{user.name} 刪除了用戶 {user_id}"

admin_user = User("Admin", ['admin', 'delete', 'read', 'write'])
delete_user(admin_user, 123)  # 成功

7. 速率限制裝飾器

from functools import wraps
import time
from collections import defaultdict

defrate_limit(calls_per_second=1):
    min_interval = 1.0 / calls_per_second
    last_called = [0.0]
    
    defdecorator(func):
        @wraps(func)
        defwrapper(*args, **kwargs):
            elapsed = time.time() - last_called[0]
            if elapsed < min_interval:
                time.sleep(min_interval - elapsed)
            
            last_called[0] = time.time()
            return func(*args, **kwargs)
        
        return wrapper
    return decorator

@rate_limit(calls_per_second=2)
defapi_call():
    print(f"API調用時間:{time.time()}")
    return"成功"

for _ in range(5):
    api_call()

8. 方法裝飾器和類裝飾器

from functools import wraps

# 方法裝飾器
defmethod_logger(func):
    @wraps(func)
    defwrapper(self, *args, **kwargs):
        print(f"調用方法 {self.__class__.__name__}.{func.__name__}")
        return func(self, *args, **kwargs)
    return wrapper

# 類裝飾器
defadd_str_repr(cls):
    def__str__(self):
        attrs = ', '.join(f"{k}={v}"for k, v in self.__dict__.items())
        returnf"{cls.__name__}({attrs})"
    
    cls.__str__ = __str__
    return cls

@add_str_repr
classPerson:
    def__init__(self, name, age):
        self.name = name
        self.age = age
    
    @method_logger
    defgreet(self):
        returnf"你好,我是{self.name}"

person = Person("Alice", 25)
print(person)  # Person(name=Alice, age=25)
person.greet()  # 調用方法 Person.greet

三、高級裝飾器模式

9. 可選參數的裝飾器

from functools import wraps

defsmart_decorator(func=None, *, enabled=True):
    defdecorator(f):
        ifnot enabled:
            return f
        
        @wraps(f)
        defwrapper(*args, **kwargs):
            print("裝飾器生效")
            return f(*args, **kwargs)
        return wrapper
    
    if func isNone:
        # 被調用時帶參數:@smart_decorator(enabled=True)
        return decorator
    else:
        # 被調用時不帶參數:@smart_decorator
        return decorator(func)

@smart_decorator
deffunc1():
    return"func1"

@smart_decorator(enabled=False)
deffunc2():
    return"func2"

10. 鏈式裝飾器

defdecorator_a(func):
    @wraps(func)
    defwrapper(*args, **kwargs):
        print("A前")
        result = func(*args, **kwargs)
        print("A后")
        return result
    return wrapper

defdecorator_b(func):
    @wraps(func)
    defwrapper(*args, **kwargs):
        print("B前")
        result = func(*args, **kwargs)
        print("B后")
        return result
    return wrapper

@decorator_a
@decorator_b
defmy_func():
    print("執行函數")
    return"結果"

my_func()
# 輸出:
# A前
# B前
# 執行函數
# B后
# A后

四、結尾

裝飾器是Python中最強大的工具之一,也是代碼復用和關注點分離的最佳實踐。從簡單的日志記錄到復雜的權限驗證,裝飾器都能優雅地解決問題。然而,要記住裝飾器的目的是讓代碼更清晰、更易維護。過度使用裝飾器反而會增加代碼復雜性。

責任編輯:趙寧寧 來源: Python數智工坊
相關推薦

2025-10-09 01:33:00

2025-11-11 09:11:57

2024-06-07 08:51:50

OpenPyXLPythonExcel文件

2024-09-06 17:45:55

Linux磁盤

2023-11-08 08:32:16

2025-10-31 00:17:39

2025-06-27 06:30:08

2023-05-09 08:34:51

PythonWith語句

2024-04-11 14:00:28

2025-01-16 10:46:31

2025-07-17 13:52:57

通配符Linux命令行

2025-11-04 07:15:00

LangChain大模型AI

2025-03-26 08:01:18

2025-01-07 14:42:09

2025-08-27 04:15:00

LlamaIndexRAG數據源

2025-10-17 07:05:00

Python數據可視化數據科學

2025-09-29 01:50:00

2025-04-11 02:30:00

2025-08-05 07:26:06

點贊
收藏

51CTO技術棧公眾號

日韩中文字幕高清在线观看| 欧美成人黑人| 成人成人成人在线视频| 欧美自拍视频在线观看| 蜜桃av免费在线观看| 精品伊人久久| 日韩欧美aaa| 影音先锋成人资源网站| 日韩成人黄色| 亚洲人成无码www久久久| 伊人222成人综合网| 久久在线免费观看| 99re视频在线播放| 国产偷人爽久久久久久老妇app| 在线精品视频在线观看高清| 亚洲欧美成人网| 香蕉视频1024| 男女啪啪999亚洲精品| 亚欧色一区w666天堂| 亚洲精品欧美精品| 天天爱天天干天天操| 精品在线免费视频| 国产精品96久久久久久| 久久精品国产亚洲AV无码男同| 欧美在线电影| 亚洲精品乱码久久久久久金桔影视| 福利片一区二区三区| 日韩精选视频| 一本久久综合亚洲鲁鲁五月天| 超薄肉色丝袜足j调教99| av网站大全在线观看| 2020国产精品| 久久国产一区二区| 亚洲成人黄色片| 精品一区二区在线免费观看| 国产精品91视频| 欧美a视频在线观看| 国产亚洲福利| 91精品国产91久久久久久久久| 黄色一级免费视频| 婷婷综合在线| 久久久极品av| 手机在线免费看片| 天天插综合网| 日韩在线播放av| 精品一区二区6| 成人黄色小视频| 尤物yw午夜国产精品视频| 欧美图片一区二区| 天天操综合520| 亚洲精品wwww| 久久精品国产亚洲av麻豆| 九九热播视频在线精品6| 亚洲高清久久网| 亚洲最大免费视频| 日韩有码中文字幕在线| 日韩电影大全免费观看2023年上| 日本黄色录像片| 日韩精品免费一区二区三区竹菊| 日韩经典中文字幕| av小说在线观看| 欧美日韩国产在线观看网站 | 91久久精品国产91性色69| 奇米影视在线99精品| 国产精品视频大全| 国产精品一区二区人人爽| 国产麻豆精品久久一二三| 亚洲直播在线一区| 黄色www视频| 久久综合资源网| 特级西西444www大精品视频| 香蕉视频在线免费看| 亚洲欧美日韩人成在线播放| 毛片在线视频观看| www.综合| 欧美色图天堂网| 潘金莲一级淫片aaaaa| av男人一区| 亚洲人成五月天| 欧美肥妇bbwbbw| 欧美一区综合| 欧美性视频精品| 一级特黄aaa大片| 国产成人超碰人人澡人人澡| 九色视频成人porny| av在线免费观看网| 亚洲一区自拍偷拍| 麻豆av免费在线| 国产精品igao视频网网址不卡日韩| 欧美电视剧在线看免费| 亚洲 小说 欧美 激情 另类| 91精品91| 欧洲精品毛片网站| 91国产免费视频| wwww国产精品欧美| 国产麻豆电影在线观看| 国产精品一二三产区| 欧美探花视频资源| 一级黄色免费视频| 色777狠狠狠综合伊人| 久久久久久久97| 姑娘第5集在线观看免费好剧| 国产91富婆露脸刺激对白| 日韩免费电影一区二区| 国产乱码在线| 欧美日韩国产综合一区二区三区| 中国黄色片视频| 国产精品久久久久久麻豆一区软件| 国模视频一区二区三区| 91福利在线观看视频| 久久美女艺术照精彩视频福利播放| 亚洲黄色网址在线观看| 欧美暴力调教| 亚洲男人第一av网站| 精品深夜av无码一区二区老年| 青椒成人免费视频| 久久久久久久有限公司| 肉体视频在线| 欧美精品视频www在线观看| 短视频在线观看| 在线观看视频免费一区二区三区| 国产精品视频一区国模私拍| 亚洲 欧美 激情 另类| 亚洲一区国产视频| 国产精品久久久久久9999| 国产一区二区三区不卡视频网站| 久久久亚洲影院| www.欧美国产| 亚洲人123区| 一区二区在线免费看| 精品一区二区三| 97成人精品区在线播放| 蜜桃视频污在线观看| 一区二区三区丝袜| 激情久久综合网| 久久在线视频| 成人性生交xxxxx网站| 中文字幕日本在线观看| 欧洲一区二区三区在线| 色综合99久久久无码国产精品| 国产精品日韩精品欧美精品| 精品视频一区二区| 欧美日韩国产观看视频| 亚洲国产欧美自拍| 色婷婷av国产精品| 91免费看`日韩一区二区| 五十路熟女丰满大屁股| 日韩三区视频| 国产v综合ⅴ日韩v欧美大片| 黄色美女网站在线观看| 在线免费观看视频一区| 色欲狠狠躁天天躁无码中文字幕 | 午夜激情视频网| 国产精品久久久久一区二区三区厕所 | 美女网站视频一区| 一级做a爰片久久毛片美女图片| 福利网址在线观看| 欧美国产亚洲另类动漫| 欧美一级视频在线| 亚洲精品久久久| 国产伦理一区二区三区| 无码小电影在线观看网站免费| 亚洲人成网站777色婷婷| 中文无码av一区二区三区| 欧美国产日本韩| 久久久久久久高清| 韩国av一区| 久久精品国产美女| av一区在线播放| 久久激情视频久久| 丰满少妇高潮在线观看| 欧美日韩性生活视频| www在线观看免费视频| 久久精品99国产精品| 丰满人妻一区二区三区53号| 都市激情久久| 国产精品第1页| 黄在线免费观看| 欧美精品一区二区三区一线天视频| 久久亚洲精品大全| 久久久精品日韩欧美| 天天干天天操天天玩| 欧美理论在线| 久久久久久a亚洲欧洲aⅴ| 欧美一级在线| 97视频在线观看免费| se在线电影| 精品国产制服丝袜高跟| 国产一级一级国产| 亚洲视频在线观看一区| 中文字幕一区二区久久人妻网站| 久久成人免费日本黄色| 黄页网站在线观看视频| 日韩精品dvd| 国产偷国产偷亚洲高清97cao| 中文字幕系列一区| 久久久久久国产精品久久| 国产福利第一视频在线播放| 日韩欧美视频一区| 中国精品一区二区| 偷拍一区二区三区四区| 中文字幕电影av| 久久久不卡网国产精品二区 | 91麻豆文化传媒在线观看| 成人黄色一级大片| 久久av一区二区三区| 久久久天堂国产精品| 欧美老女人另类| 久久香蕉综合色| 国产剧情一区二区在线观看| 日av在线播放中文不卡| 国产高清在线a视频大全| 色妞一区二区三区| 裸体xxxx视频在线| 亚洲国产精品va在线观看黑人| 97超碰中文字幕| 色天天综合久久久久综合片| 99免费在线观看| 一区二区三区在线影院| 亚洲色图27p| 国产欧美一区二区三区在线老狼| 欧美大喷水吹潮合集在线观看| 国产在线一区二区| 中文字幕第17页| 麻豆精品在线看| 亚洲福利精品视频| 三级欧美在线一区| 无码精品国产一区二区三区免费| 国产综合久久| www.日本三级| 欧美激情日韩| 九九久久九九久久| 888久久久| a级网站在线观看| 午夜欧美在线| 中文精品一区二区三区| 日韩久久视频| 亚洲午夜精品久久久中文影院av | 91免费观看视频在线| 亚洲麻豆一区二区三区| 国产成人亚洲综合a∨婷婷| 日本中文字幕观看| 麻豆成人av在线| 久久久久国产一区| 欧美a级一区二区| 亚洲 激情 在线| 美国毛片一区二区三区| 美女少妇一区二区| 麻豆精品久久精品色综合| 亚洲欧美另类动漫| 蜜桃视频一区二区三区 | 日本一区二区三区视频在线看 | 91av成人在线| 自拍视频在线看| 青青久久av北条麻妃海外网| 一区二区三区短视频| 国产www精品| 久久久久黄色| julia一区二区中文久久94| 91精品尤物| 久久久精品动漫| 国产一区二区三区四区五区传媒 | 亚洲最大成人网色| 91免费精品国偷自产在线在线| 成人黄动漫网站免费| 国产精品极品在线观看| 久久大香伊蕉在人线观看热2| 三级小说欧洲区亚洲区| 日本一区二区三区www| 日韩欧美一区二区三区在线视频| 无码人妻精品一区二区三区99v| 欧美精品一卡| 99re在线视频免费观看| 毛片av一区二区| 日本50路肥熟bbw| 91丨porny丨在线| 俄罗斯毛片基地| 一二三四区精品视频| 亚洲免费在线视频观看| 欧美日韩美少妇| 好吊色一区二区| 中文字幕9999| 在线中文字幕视频观看| 欧美一区第一页| 91成人在线网站| 国产欧美日韩一区| 成人免费电影网址| 天天做天天躁天天躁| 免费欧美日韩| 欧美性猛交xx| 久久久五月婷婷| 日韩一级片av| 一本大道久久精品懂色aⅴ| 91福利在线观看视频| 日韩av影视在线| 看黄网站在线观看| 欧美一级视频在线观看| 国产精品一区免费在线| 免费在线成人av电影| 欧美激情第二页| 宅男噜噜噜66国产免费观看| 丁香婷婷综合激情五月色| 久久丫精品忘忧草西安产品| 一区二区三区中文免费| 中文字幕欧美人妻精品| 亚洲精品国产综合久久| 黄色免费在线网站| 日本一欧美一欧美一亚洲视频| 日本亚洲视频| 在线视频精品一区| 麻豆精品91| 日韩www视频| 亚洲精品大片www| 中文字幕乱码无码人妻系列蜜桃| 亚洲成avwww人| 欧美6一10sex性hd| 成人午夜在线影院| 久久一区91| 国产又大又黄又粗又爽| 久久―日本道色综合久久 | 91极品美女在线| 人人妻人人澡人人爽人人欧美一区 | 日韩在线卡一卡二| chinese麻豆新拍video| 一区二区三区中文字幕| 国产高潮在线观看| 精品国产欧美成人夜夜嗨| av在线日韩| 免费影院在线观看一区| 国产精品视频| 亚洲av无码一区二区三区网址| 亚洲综合成人在线| 亚洲第一成年人网站| 麻豆乱码国产一区二区三区| 国产成人a视频高清在线观看| 日韩精品成人一区二区在线观看| 午夜影院日韩| 国产交换配乱淫视频免费| 欧美日韩性生活视频| 人成在线免费视频| 人体精品一二三区| 国产亚洲电影| 中文久久久久久| 中文字幕 久热精品 视频在线| 探花国产精品一区二区| 中文字幕一区日韩电影| 成人在线视频观看| 亚洲精品免费在线看| 国内精品在线播放| 欧美老熟妇一区二区三区| 69久久99精品久久久久婷婷| 99福利在线| 国产精品12| 在线一区免费观看| 久操视频免费看| 欧美色综合久久| 麻豆tv免费在线观看| 91青青草免费在线看| 午夜国产精品视频| 99精品一区二区三区无码吞精| 欧美日韩免费在线观看| 国产视频二区在线观看| 国产精品视频久久久久| 亚洲一区色图| 国产黑丝一区二区| 日本高清不卡一区| 免费在线观看黄色| 国产二区一区| 手机精品视频在线观看| 精品一区二区在线观看视频| 日韩一卡二卡三卡国产欧美| 九色porny视频在线观看| 欧美日韩国产一二| 久久精品av麻豆的观看方式| 精品视频在线观看免费| 日韩精品在线观看网站| 国产成人a视频高清在线观看| 国产1区2区3区中文字幕| 91免费国产视频网站| 97超碰资源站| 欧美亚洲另类在线| 欧美国产美女| 丰满人妻一区二区三区免费视频棣| 91高清在线观看| 182tv在线播放| 日韩欧美亚洲日产国| 国产高清不卡一区| 精品国产乱子伦| 欧美日韩成人在线播放| 国产99久久久国产精品成人免费| 日本美女视频一区| 富二代精品短视频| 国产91在线视频蝌蚪| 久久天天狠狠| 国产成a人亚洲精品| 黄色av网站免费| 欧美精品成人91久久久久久久| 精品一级毛片| 插我舔内射18免费视频| 777奇米四色成人影色区|