Python標(biāo)準(zhǔn)庫(kù)中內(nèi)置裝飾器@staticmethod和@classmethod
裝飾器是Python中強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或方法的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接受另一個(gè)函數(shù)作為參數(shù),并返回一個(gè)新的函數(shù),通常用于在不修改原始函數(shù)代碼的情況下添加額外的功能或行為。這種技術(shù)稱(chēng)為元編程,它在許多Python代碼中都有廣泛的應(yīng)用。
下面是裝飾器的原理和用法:
原理:
- 函數(shù)是一等公民:在Python中,函數(shù)是一等公民,這意味著你可以將函數(shù)作為參數(shù)傳遞給其他函數(shù),也可以從函數(shù)中返回函數(shù)。
- 裝飾器函數(shù):裝飾器本身就是一個(gè)函數(shù),它接受一個(gè)函數(shù)作為輸入?yún)?shù),并返回一個(gè)新的函數(shù),通常在新函數(shù)中修改或增強(qiáng)原始函數(shù)的行為。
- "@" 語(yǔ)法糖:Python提供了一種方便的方式來(lái)應(yīng)用裝飾器,使用 "@" 符號(hào)緊跟在函數(shù)定義之前,將裝飾器應(yīng)用于函數(shù)。
# 定義一個(gè)裝飾器函數(shù) def my_decorator(func): def wrapper(): print("在函數(shù)調(diào)用之前執(zhí)行一些操作") func() # 調(diào)用原始函數(shù) print("在函數(shù)調(diào)用之后執(zhí)行一些操作") return wrapper # 應(yīng)用裝飾器 @my_decorator def say_hello(): print("Hello, World!") # 調(diào)用被裝飾的函數(shù) say_hello() # 在函數(shù)調(diào)用之前執(zhí)行一些操作 # Hello, World! # 在函數(shù)調(diào)用之后執(zhí)行一些操作 # [Finished in 625ms]
def log_decorator(func): def wrapper(*args, **kwargs): print(f"調(diào)用函數(shù) {func.__name__},參數(shù): {args}, {kwargs}") result = func(*args, **kwargs) print(f"函數(shù) {func.__name__} 執(zhí)行完畢,結(jié)果: {result}") return result return wrapper @log_decorator def add(a, b): return a + b result = add(2, 3) #裝飾器會(huì)記錄函數(shù)的調(diào)用和結(jié)果 # 調(diào)用函數(shù) add,參數(shù): (2, 3), {} # 函數(shù) add 執(zhí)行完畢,結(jié)果: 5 # [Finished in 578ms]
import time def performance_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"函數(shù) {func.__name__} 執(zhí)行時(shí)間: {end_time - start_time} 秒") return result return wrapper @performance_decorator def slow_function(): time.sleep(2) slow_function() # 函數(shù) slow_function 執(zhí)行時(shí)間: 2.0054738521575928 秒
@classmethod
裝飾器: # Python標(biāo)準(zhǔn)庫(kù)中包含一些有用的內(nèi)置裝飾器
@classmethod
裝飾器用于定義類(lèi)方法,這些方法第一個(gè)參數(shù)是類(lèi)本身(通常命名為cls
),可以通過(guò)類(lèi)名或?qū)嵗{(diào)用。- 類(lèi)方法通常用于執(zhí)行與類(lèi)相關(guān)的操作,但不依賴(lài)于特定實(shí)例的狀態(tài)。
class Person: total_people = 0 def __init__(self, name): self.name = name Person.total_people += 1 @classmethod def get_total_people(cls): return cls.total_people p1 = Person("Alice") p2 = Person("Bob") total = Person.get_total_people()
@staticmethod
裝飾器: #Python標(biāo)準(zhǔn)庫(kù)中包含一些有用的內(nèi)置裝飾器
@staticmethod
裝飾器用于定義靜態(tài)方法,這些方法與類(lèi)的實(shí)例無(wú)關(guān),可以通過(guò)類(lèi)名直接調(diào)用,不需要?jiǎng)?chuàng)建類(lèi)的實(shí)例。- 靜態(tài)方法通常用于執(zhí)行與類(lèi)相關(guān)但不依賴(lài)于實(shí)例狀態(tài)的操作。
class MathUtility: @staticmethod def add(a, b): return a + b result = MathUtility.add(2, 3)
這些內(nèi)置裝飾器允許你更靈活地定義類(lèi)中的方法,靜態(tài)方法用于獨(dú)立于實(shí)例的操作,而類(lèi)方法用于與類(lèi)相關(guān)的操作。它們提供了一種方便的方式來(lái)組織和訪問(wèn)與類(lèi)關(guān)聯(lián)的函數(shù)。
到此這篇關(guān)于Python標(biāo)準(zhǔn)庫(kù)中內(nèi)置裝飾器@staticmethod和@classmethod的文章就介紹到這了,更多相關(guān)Python @staticmethod和@classmethod內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中類(lèi)方法@classmethod和靜態(tài)方法@staticmethod解析
- Python?class類(lèi)@staticmethod及@classmethod區(qū)別淺析
- 詳解python中@classmethod和@staticmethod方法
- 詳解Python中@staticmethod和@classmethod區(qū)別及使用示例代碼
- Python 類(lèi)方法和實(shí)例方法(@classmethod),靜態(tài)方法(@staticmethod)原理與用法分析
- Python中@classmethod和@staticmethod的區(qū)別
相關(guān)文章
Python自動(dòng)化之批量生成含指定數(shù)據(jù)的word文檔
在平時(shí)工作當(dāng)中,經(jīng)常需要處理文件,特別是Word,我們常常會(huì)機(jī)械的重復(fù)打開(kāi)、修改、保存文檔等一系列操作。本文將主要介紹如何通過(guò)Python批量生成含指定數(shù)據(jù)的word文檔,感興趣的同學(xué)可以來(lái)看一看2021-11-11Python寫(xiě)的Socks5協(xié)議代理服務(wù)器
這篇文章主要介紹了Python寫(xiě)的Socks5協(xié)議代理服務(wù)器,代碼來(lái)自網(wǎng)上,需要的朋友可以參考下2014-08-08Python網(wǎng)絡(luò)編程之使用email、smtplib、poplib、imaplib模塊收發(fā)郵件
這篇文章介紹了Python使用email、smtplib、poplib、imaplib模塊收發(fā)郵件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05Python實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽(tīng)多個(gè)客戶(hù)端請(qǐng)求
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)一個(gè)服務(wù)器監(jiān)聽(tīng)多個(gè)客戶(hù)端請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04python中input()與raw_input()的區(qū)別分析
這篇文章主要介紹了python中input()與raw_input()的區(qū)別,需要的朋友可以參考下2016-02-02Python面向?qū)ο笾腴T(mén)類(lèi)和對(duì)象
這篇文章主要為大家介紹了Python入門(mén)類(lèi)和對(duì)象,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-12-12