最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python全景系列之裝飾器使用的全面講解

 更新時(shí)間:2023年05月31日 14:22:25   作者:techlead_krischang  
裝飾器在Python中扮演了重要的角色,文將深入探討裝飾器的所有相關(guān)主題,包括裝飾器的基礎(chǔ)知識(shí)、實(shí)現(xiàn)與使用、工作原理等,需要的可以參考一下

Python 裝飾器深入探討

在 Python 中,裝飾器提供了一種簡(jiǎn)潔的方式,用來(lái)修改或增強(qiáng)函數(shù)和類(lèi)的行為。裝飾器在語(yǔ)法上表現(xiàn)為一個(gè)前置于函數(shù)或類(lèi)定義之前的特殊標(biāo)記:

@simple_decorator
def hello_world():
    print("Hello, world!")

在這個(gè)例子中,simple_decorator 是一個(gè)裝飾器,它作用于下方的 hello_world 函數(shù)。裝飾器在概念上就像一個(gè)包裝器,它可以在被裝飾的函數(shù)執(zhí)行前后插入任意的代碼,進(jìn)而改變被裝飾函數(shù)的行為。

參數(shù)化裝飾器

我們還可以進(jìn)一步將裝飾器參數(shù)化,這讓裝飾器的行為更具靈活性。比如,我們可以定義一個(gè)裝飾器,讓它在函數(shù)執(zhí)行前后打印自定義的消息:

def message_decorator(before_message, after_message):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(before_message)
            result = func(*args, **kwargs)
            print(after_message)
            return result
        return wrapper
    return decorator

@message_decorator("Start", "End")
def hello_world():
    print("Hello, world!")

在這個(gè)例子中,message_decorator 是一個(gè)參數(shù)化裝飾器,它接受兩個(gè)參數(shù),分別代表函數(shù)執(zhí)行前后要打印的消息。

理解裝飾器的工作原理

在 Python 中,函數(shù)是第一類(lèi)對(duì)象。這意味著函數(shù)和其他對(duì)象一樣,可以作為變量進(jìn)行賦值,可以作為參數(shù)傳給其他函數(shù),可以作為其他函數(shù)的返回值,甚至可以在一個(gè)函數(shù)里面定義另一個(gè)函數(shù)。這個(gè)特性是實(shí)現(xiàn)裝飾器的基礎(chǔ)。

def decorator(func):
    def wrapper():
        print('Before function execution')
        func()
        print('After function execution')
    return wrapper

def hello_world():
    print('Hello, world!')

decorated_hello = decorator(hello_world)
decorated_hello()

在這個(gè)例子中,decorator 函數(shù)接收一個(gè)函數(shù) hello_world 作為參數(shù),并返回了一個(gè)新的函數(shù) wrapped_func。這個(gè)新函數(shù)在 hello_world 函數(shù)執(zhí)行前后分別打印一條消息。我們可以看到,裝飾器實(shí)際上是一個(gè)返回函數(shù)的函數(shù)。

函數(shù)簽名保持

默認(rèn)情況下,裝飾器會(huì)“掩蓋”掉原函數(shù)的名字和文檔字符串。這是因?yàn)樵谘b飾器內(nèi)部,我們返回了一個(gè)全新的函數(shù)。我們可以使用 functools.wraps 來(lái)解決這個(gè)問(wèn)題:

import functools
def decorator(func):
    @functools.wraps(func)
    def wrapper():
        print('Before function execution')
        func()
        print('After function execution')
    return wrapper
@decorator
def hello_world():
    "Prints 'Hello, world!'"
    print('Hello, world!')
print(hello_world.__name__)
print(hello_world.__doc__)

這樣,使用裝飾器后的函數(shù)名和文檔字符串能夠保持不變。

Python 裝飾器的應(yīng)用實(shí)例

裝飾器在實(shí)際的 Python 編程中有許多應(yīng)用場(chǎng)景,比如日志記錄、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等。

一個(gè)常見(jiàn)的應(yīng)用就是使用裝飾器進(jìn)行日志記錄:

import logging

def log_decorator(func):
    logging.basicConfig(level=logging.INFO)
    
    def wrapper(*args, **kwargs):
        logging.info(f'Running "{func.__name__}" with arguments {args} and kwargs {kwargs}')
        result = func(*args, **kwargs)
        logging.info(f'Finished "{func.__name__}" with result {result}')
        return result
    
    return wrapper

@log_decorator
def add(x, y):
    return x + y

這個(gè)裝飾器記錄了函數(shù)的名稱(chēng),函數(shù)調(diào)用的參數(shù),以及函數(shù)返回的結(jié)果。

裝飾器鏈

Python 允許我們將多個(gè)裝飾器應(yīng)用到一個(gè)函數(shù)上,形成一個(gè)裝飾器鏈。例如,我們可以同時(shí)應(yīng)用日志裝飾器和性能測(cè)試裝飾器:

import time
import logging
from functools import wraps

def log_decorator(func):
    logging.basicConfig(level=logging.INFO)
    
    @wraps(func)
    def wrapper(*args, **kwargs):
        logging.info(f'Running "{func.__name__}" with arguments {args} and kwargs {kwargs}')
        result = func(*args, **kwargs)
        logging.info(f'Finished "{func.__name__}" with result {result}')
        return result

    return wrapper

def timer_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'Function "{func.__name__}" took {end_time - start_time} seconds to run.')
        return result

    return wrapper

@log_decorator
@timer_decorator
def add(x, y):
    time.sleep(2)
    return x + y

在這個(gè)例子中,@log_decorator 和 @timer_decorator 兩個(gè)裝飾器被同時(shí)應(yīng)用到 add 函數(shù)上,它們分別負(fù)責(zé)記錄日志和測(cè)量函數(shù)運(yùn)行時(shí)間。

One More Thing: 自動(dòng)注冊(cè)裝飾器

一個(gè)有趣的裝飾器應(yīng)用是自動(dòng)注冊(cè)。這個(gè)裝飾器會(huì)在裝飾函數(shù)時(shí)自動(dòng)將函數(shù)添加到一個(gè)列表或字典中,這樣我們就可以在程序的其他地方訪(fǎng)問(wèn)到這個(gè)列表或字典,知道有哪些函數(shù)被裝飾過(guò)。

# 裝飾器將函數(shù)注冊(cè)到一個(gè)列表中
def register_decorator(func_list):
    def decorator(func):
        func_list.append(func)
        return func
    return decorator

# 自動(dòng)注冊(cè)函數(shù)
registered_functions = []
@register_decorator(registered_functions)
def foo():
    pass

@register_decorator(registered_functions)
def bar():
    pass

print(registered_functions)  # 輸出: [<function foo at 0x10d38d160>, <function bar at 0x10d38d1f0>]

這個(gè)裝飾器可以用于自動(dòng)注冊(cè)路由、插件系統(tǒng)、命令行參數(shù)處理等場(chǎng)景,能夠大大提高代碼的靈活性和可擴(kuò)展性。

總結(jié)

Python 裝飾器是一種強(qiáng)大的工具,它可以讓我們更有效地管理和組織代碼。希望通過(guò)這篇文章,你能夠更深入地理解裝飾器的工作原理和用法,從而在你的項(xiàng)目中更好地使用裝飾器。

到此這篇關(guān)于Python全景系列之裝飾器使用的全面講解的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python創(chuàng)建Excel的4種方式小結(jié)

    Python創(chuàng)建Excel的4種方式小結(jié)

    這篇文章主要為大家詳細(xì)介紹了Python中創(chuàng)建Excel的4種常見(jiàn)方式,文中的示例代碼簡(jiǎn)潔易懂,具有一定的參考價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2025-02-02
  • Python中的pickle模塊解析

    Python中的pickle模塊解析

    這篇文章主要介紹了Python中的pickle模塊解析,pickle 模塊和 json 模塊很像,都有序列化的功能,不過(guò) pickle 模塊更加局限一些只能對(duì) python 使用,它可以對(duì)一個(gè) python 對(duì)象結(jié)構(gòu)的二進(jìn)制序列化和反序列化,需要的朋友可以參考下
    2023-09-09
  • 深入解析Python高效記錄重試日志??的兩種方法

    深入解析Python高效記錄重試日志??的兩種方法

    在日常開(kāi)發(fā)中,??臨時(shí)性錯(cuò)誤是程序員最常遇到的挑戰(zhàn)之一,本文將深入解析兩種??高效記錄重試日志??的方法——??鉤子函數(shù)法??和??裝飾器封裝法??,幫助你輕松構(gòu)建健壯的應(yīng)用程序,感興趣的可以了解下
    2025-06-06
  • Python編寫(xiě)屏幕網(wǎng)格生成工具

    Python編寫(xiě)屏幕網(wǎng)格生成工具

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python編寫(xiě)屏幕網(wǎng)格生成工具,可以定期繪制一個(gè)透明的網(wǎng)格,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 利用python實(shí)現(xiàn)xml與數(shù)據(jù)庫(kù)讀取轉(zhuǎn)換的方法

    利用python實(shí)現(xiàn)xml與數(shù)據(jù)庫(kù)讀取轉(zhuǎn)換的方法

    這篇文章主要給大家介紹了關(guān)于利用python實(shí)現(xiàn)xml與數(shù)據(jù)庫(kù)讀取轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(3)

    Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(3)

    這篇文章主要為大家詳細(xì)介紹了Python中的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • python BeautifulSoup使用方法詳解

    python BeautifulSoup使用方法詳解

    Beautiful Soup 是用Python寫(xiě)的一個(gè)HTML/XML的解析器,它可以很好的處理不規(guī)范標(biāo)記并生成剖析樹(shù)(parse tree)。 它提供簡(jiǎn)單又常用的導(dǎo)航(navigating),搜索以及修改剖析樹(shù)的操作。它可以大大節(jié)省你的編程時(shí)間,下面我們就看看他是如何使用
    2013-11-11
  • python?label與one-hot之間的互相轉(zhuǎn)換方式

    python?label與one-hot之間的互相轉(zhuǎn)換方式

    這篇文章主要介紹了python?label與one-hot之間的互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python中if和elif的用法示例及區(qū)別詳解

    Python中if和elif的用法示例及區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Python中if和elif的用法示例及區(qū)別的相關(guān)資料,除了基本的if和else語(yǔ)句外,elif(即else?if)也是一個(gè)非常重要的組成部分,需要的朋友可以參考下
    2024-04-04
  • Python使用xlrd和xlwt實(shí)現(xiàn)自動(dòng)化操作Excel

    Python使用xlrd和xlwt實(shí)現(xiàn)自動(dòng)化操作Excel

    這篇文章主要介紹了Python使用xlrd和xlwt實(shí)現(xiàn)自動(dòng)化操作Excel,xlwt只能對(duì)Excel進(jìn)行寫(xiě)操作。xlwt和xlrd不光名字像,連很多函數(shù)和操作格式也是完全相
    2022-08-08

最新評(píng)論

彰化市| 班玛县| 万山特区| 华蓥市| 恩施市| 开封市| 沂源县| 塔城市| 自贡市| 泰顺县| 定安县| 南投县| 三门峡市| 临江市| 临沂市| 城市| 锦屏县| 灵璧县| 揭阳市| 松桃| 沂南县| 象州县| 香河县| 开封县| 永川市| 河西区| 大兴区| 莱阳市| 樟树市| 扬州市| 年辖:市辖区| 仙桃市| 孝昌县| 武隆县| 咸丰县| 兴业县| 乐安县| 义马市| 胶州市| 苏尼特左旗| 修武县|