欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深度解析Python裝飾器常見用法與進(jìn)階技巧

 更新時(shí)間:2025年06月25日 14:53:36   作者:天天進(jìn)步2015  
Python 裝飾器(Decorator)是提升代碼可讀性與復(fù)用性的強(qiáng)大工具,本文將深入解析 Python 裝飾器的原理,常見用法,進(jìn)階技巧與最佳實(shí)踐,希望可以幫助大家寫出更具專業(yè)水準(zhǔn)的 Python 代碼

裝飾器的基本原理

裝飾器本質(zhì)上是一個(gè)高階函數(shù),即:以函數(shù)為參數(shù)并返回新函數(shù)的函數(shù)。它可以在不修改原始函數(shù)代碼的前提下,動(dòng)態(tài)地為其添加功能。

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print('Before function call')
        result = func(*args, **kwargs)
        print('After function call')
        return result
    return wrapper

@my_decorator
def say_hello():
    print('Hello, world!')

say_hello()

輸出:

Before function call
Hello, world!
After function call

函數(shù)裝飾器的常見用法

1.日志記錄

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f'Calling {func.__name__}')
        return func(*args, **kwargs)
    return wrapper

2.權(quán)限校驗(yàn)

def require_admin(func):
    def wrapper(user, *args, **kwargs):
        if not user.is_admin:
            raise PermissionError('Admin required')
        return func(user, *args, **kwargs)
    return wrapper

3.性能分析

import time

def timeit(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__} took {end - start:.4f}s')
        return result
    return wrapper

4.緩存機(jī)制

from functools import lru_cache

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

帶參數(shù)的裝飾器

帶參數(shù)的裝飾器需要再包一層函數(shù):

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def greet():
    print('Hello!')

類裝飾器與方法裝飾器

類裝飾器

可以用于增強(qiáng)類的功能:

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class Database:
    pass

方法裝飾器

與函數(shù)裝飾器類似,但要注意 self 的傳遞:

def method_logger(func):
    def wrapper(self, *args, **kwargs):
        print(f'Calling {func.__name__} of {self}')
        return func(self, *args, **kwargs)
    return wrapper

class MyClass:
    @method_logger
    def foo(self):
        print('foo called')

裝飾器的嵌套與組合

多個(gè)裝飾器可以疊加使用,執(zhí)行順序?yàn)樽韵露希?/p>

@decorator_a
@decorator_b
def func():
    pass
# 等價(jià)于 func = decorator_a(decorator_b(func))

進(jìn)階技巧:保留元信息與類型提示

裝飾器會(huì)改變被裝飾函數(shù)的元信息(如__name__, __doc__),推薦用 functools.wraps 保留原信息:

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

對(duì)于類型提示,可以直接在裝飾器和被裝飾函數(shù)中添加 type hints。

裝飾器最佳實(shí)踐

  • 始終使用 functools.wraps 保留函數(shù)元信息
  • 為裝飾器編寫單元測(cè)試,確保功能可復(fù)用且無(wú)副作用
  • 合理使用裝飾器,避免過(guò)度嵌套導(dǎo)致調(diào)試?yán)щy
  • 利用標(biāo)準(zhǔn)庫(kù)裝飾器(如 @staticmethod, @classmethod, @property, @lru_cache)提升開發(fā)效率
  • 為裝飾器添加類型提示和文檔字符串

總結(jié)

Python 裝飾器讓我們以聲明式、可復(fù)用的方式增強(qiáng)函數(shù)和類的行為。掌握裝飾器的原理與用法,不僅能提升代碼的可讀性和復(fù)用性,更能讓你的 Python 項(xiàng)目更具專業(yè)水準(zhǔn)。建議在實(shí)際開發(fā)中多加練習(xí),靈活運(yùn)用裝飾器解決實(shí)際問題。

到此這篇關(guān)于深度解析Python裝飾器常見用法與進(jìn)階技巧的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中self關(guān)鍵字的用法解析

    Python中self關(guān)鍵字的用法解析

    在Python中,self是一個(gè)經(jīng)常出現(xiàn)的關(guān)鍵字,特別是在類定義中的方法,這篇文章主要和大家self的作用和用法,希望可以幫助大家更好地理解為什么需要它以及如何正確使用它
    2023-11-11
  • 詳解Python的Django框架中的中間件

    詳解Python的Django框架中的中間件

    這篇文章主要介紹了詳解Python的Django框架中的中間件,包括中間件的安裝等內(nèi)容,需要的朋友可以參考下
    2015-07-07
  • Python中使用Beautiful Soup庫(kù)的超詳細(xì)教程

    Python中使用Beautiful Soup庫(kù)的超詳細(xì)教程

    這篇文章主要介紹了Python中使用Beautiful Soup庫(kù)的超詳細(xì)教程,示例代碼基于Python2.x版本,極力推薦!需要的朋友可以參考下
    2015-04-04
  • 手把手教你Python yLab的繪制折線圖的畫法

    手把手教你Python yLab的繪制折線圖的畫法

    這篇文章主要介紹了手把手教你Python yLab的繪制折線圖的畫法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Python批量處理圖片大小尺寸方法詳解

    Python批量處理圖片大小尺寸方法詳解

    這篇文章主要介紹了用Python批量處理圖片大小尺寸的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • Django自帶用戶認(rèn)證系統(tǒng)使用方法解析

    Django自帶用戶認(rèn)證系統(tǒng)使用方法解析

    這篇文章主要介紹了Django自帶用戶認(rèn)證系統(tǒng)使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python實(shí)現(xiàn)aes加密及pycryptodome庫(kù)使用

    python實(shí)現(xiàn)aes加密及pycryptodome庫(kù)使用

    AES算法是高級(jí)加密標(biāo)準(zhǔn),它是一種對(duì)稱加密算法,AES只有一個(gè)密鑰,這個(gè)密鑰既用來(lái)加密,也用于解密,這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)aes加密及pycryptodome庫(kù)使用的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 使用Python將Markdown文件轉(zhuǎn)換為Word的三種方法

    使用Python將Markdown文件轉(zhuǎn)換為Word的三種方法

    在當(dāng)今的文檔處理中,Markdown因其簡(jiǎn)潔的語(yǔ)法和易讀性而廣受歡迎,而Microsoft Word則因其廣泛的兼容性和專業(yè)的排版效果成為商業(yè)文檔的標(biāo)準(zhǔn),所以本文將給大家介紹使用Python將Markdown文件轉(zhuǎn)換為Word的三種方法,需要的朋友可以參考下
    2025-04-04
  • 使用python爬取抖音app視頻的實(shí)例代碼

    使用python爬取抖音app視頻的實(shí)例代碼

    這篇文章主要介紹了使用python爬取抖音app視頻的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • python基礎(chǔ)詳解之if循環(huán)語(yǔ)句

    python基礎(chǔ)詳解之if循環(huán)語(yǔ)句

    這篇文章主要介紹了python基礎(chǔ)詳解之if循環(huán)語(yǔ)句,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助需要的朋友可以參考下
    2021-04-04

最新評(píng)論