裝飾器是對(duì)功能函數(shù)的加強(qiáng). 在原來(lái)的功能函數(shù)之外,另外定義一個(gè)裝飾器函數(shù),對(duì)原來(lái)的功能函數(shù)進(jìn)行封裝(wrapper)并在wrapper的過(guò)程中增加一些輔助功能。
創(chuàng)新互聯(lián)專(zhuān)注于清苑網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供清苑營(yíng)銷(xiāo)型網(wǎng)站建設(shè),清苑網(wǎng)站制作、清苑網(wǎng)頁(yè)設(shè)計(jì)、清苑網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造清苑網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供清苑網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
如下場(chǎng)景:
業(yè)務(wù)函數(shù)func_biz_1(), func_biz_2()... 里面寫(xiě)的是業(yè)務(wù)邏輯代碼。如果我們現(xiàn)在希望在每個(gè)函數(shù)里面增加一些輔助功能(比如打印日志,計(jì)算函數(shù)運(yùn)行時(shí)間)
這些輔助功能的代碼都是通用的。不使用decorator的情況下我們就要在業(yè)務(wù)函數(shù)里面增加這些輔助代碼,缺點(diǎn):
要解決這個(gè)問(wèn)題就要用裝飾器,將業(yè)務(wù)函數(shù)封裝(wrapper),在wrapper的過(guò)程中將輔助功能代碼加進(jìn)去。
一個(gè)函數(shù)里面既有主業(yè)務(wù)邏輯(打印質(zhì)數(shù)),又有輔助功能(對(duì)函數(shù)執(zhí)行時(shí)間計(jì)時(shí))
import time
# 判斷輸入的num是否是質(zhì)數(shù)
def is_prime(num):
''' Tell if num is a prime number '''
if num < 2:
return False
if num == 2:
return True
for i in range(2, num):
if num % i == 0:
return False
return True
# 打印2到之間所有的質(zhì)數(shù)
def prime_numbers():
''' print all the prime numbers btw 2...
print the onsumed time
'''
t_start = time.time()
for i in range(2, ):
if is_prime(i):
print(i)
t_stop = time.time()
print("time consumed: {}".format(t_stop - t_start))
prime_numbers()
缺點(diǎn): 統(tǒng)計(jì)時(shí)間的代碼和業(yè)務(wù)代碼混在一起寫(xiě)在prime_numbers()里面
import time
# 定義一個(gè)裝飾器: 統(tǒng)計(jì)函數(shù)運(yùn)行時(shí)間
def display_time(func):
''' define a decorator函數(shù),參數(shù)是函數(shù) '''
def wrapper():
t_start = time.time()
func()
t_stop = time.time()
print("time consumed: {:.4}".format(t_stop - t_start))
return wrapper
# 判斷輸入的num是否是質(zhì)數(shù)
def is_prime(num):
''' Tell if num is a prime number '''
if num < 2:
return False
if num == 2:
return True
for i in range(2, num):
if num % i == 0:
return False
return True
# 打印2到之間的質(zhì)數(shù)count
@display_time
def prime_numbers():
''' count the prime numbers btw 2... '''
for i in range(2, ):
if is_prime(i):
print(i)
prime_numbers() # 運(yùn)行它的時(shí)候?qū)嶋H上運(yùn)行的是裝飾器函數(shù)wrapper()
通過(guò)裝飾器實(shí)現(xiàn)了業(yè)務(wù)邏輯與主服務(wù)功能的分離