日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python中的裝飾器使用_python

作者:子休_ ? 更新時(shí)間: 2023-01-18 編程語(yǔ)言

Python裝飾器用法

Python的裝飾器是個(gè)好東西,它能干很多事情。

但對(duì)于新手,它看起來(lái)似乎沒(méi)那么簡(jiǎn)單。

但事實(shí)上,裝飾器本身也只是個(gè)函數(shù)。

import time
def log(func):
? ? def wrapper(*args, **kwargs):
? ? ? ? start = time.time()
? ? ? ? result = func(*args, **kwargs)
? ? ? ? end = time.time()
? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? return result
? ? return warpper

這一個(gè)裝飾器,當(dāng)我們這樣使用時(shí)

@log
def fucok(name):
? ? """Fucok someone"""
? ? print("Fucok", name)

它只是執(zhí)行了fucok = log(fucok)這樣一句代碼而已。

也就是說(shuō),我們表面上是用fucok("myself"),事實(shí)上執(zhí)行的都是log(fucok)("myself")。因?yàn)镻ython里面都是對(duì)象嘛。

同樣的道理,假設(shè)我們定義了一個(gè)帶參數(shù)的裝飾器logging,它實(shí)際上執(zhí)行的是

func = logging(arguments)(func)

也就是上面那個(gè)不帶參數(shù)的裝飾器多定義一層就行了。

import time
def logging(arguments):
? ? def log(func):
? ? ? ? def warpper(*args, **kwargs):
? ? ? ? ? ? start = time.time()
? ? ? ? ? ? result = func(*args, **kwargs)
? ? ? ? ? ? end = time.time()
? ? ? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? ? ? return result
? ? ? ? return warpper
? ? # do something
? ? return log

但,當(dāng)我們使用一個(gè)裝飾器之后,它會(huì)將原本的函數(shù)元信息給覆蓋掉。譬如:函數(shù)名稱(chēng),函數(shù)文檔等等。

例如上例

print(fucok.__name__)
print(fucok.__doc__)

你會(huì)發(fā)現(xiàn),函數(shù)信息全部沒(méi)了!fucok它不叫fucok,改名叫wrapper了。它的文檔也變成了none。

解決辦法很簡(jiǎn)單,定義裝飾器的時(shí)候用warps裝飾器裝飾接受原函數(shù)參數(shù)的那一層就行了。

這個(gè)來(lái)自functools模塊的裝飾器能幫你復(fù)制函數(shù)的元信息到被綁定的函數(shù)身上。

修改裝飾器如下(其實(shí)就加了一行代碼hhh)

import time
from functools import wraps
def log(func):
? ? @wraps(func)
? ? def warpper(*args, **kwargs):
? ? ? ? start = time.time()
? ? ? ? result = func(*args, **kwargs)
? ? ? ? end = time.time()
? ? ? ? print("The func '{}' used {}s.".format(func.__name__, end-start))
? ? ? ? return result
? ? return warpper

當(dāng)我們?cè)龠\(yùn)行

print(fucok.__name__)
print(fucok.__doc__)

就能看到函數(shù)的的元信息沒(méi)變了。

裝飾器定義時(shí)加@wraps是個(gè)好習(xí)慣。

一個(gè)較為實(shí)用的裝飾器demo在該專(zhuān)題的另一篇文章:函數(shù)參數(shù)類(lèi)型檢查

總結(jié)

原文鏈接:https://www.jianshu.com/p/4416e291c64d

欄目分類(lèi)
最近更新