介紹
裝飾器是對功能函式的加強. 在原來的功能函式之外,另外定義一個裝飾器函式,對原來的功能函式進行封裝(wrapper)并在wrapper的程序中增加一些輔助功能,
應用場景
如下場景:
業務函式func_biz_1(), func_biz_2()... 里面寫的是業務邏輯代碼,如果我們現在希望在每個函式里面增加一些輔助功能(比如列印日志,計算函式運行時間)
這些輔助功能的代碼都是通用的,不使用decorator的情況下我們就要在業務函式里面增加這些輔助代碼,缺點:
- 輔助功能的代碼重復copy到每個功能func中
- 修改輔助功能的代碼很麻煩
- 業務func里面同時有業務邏輯和輔助功能的代碼混在一起,代碼量變大,且非常亂,
要解決這個問題就要用裝飾器,將業務函式封裝(wrapper),在wrapper的程序中將輔助功能代碼加進去,
代碼例子
不用裝飾器
一個函式里面既有主業務邏輯(列印質數),又有輔助功能(對函式執行時間計時)
import time
# 判斷輸入的num是否是質數
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到10000之間所有的質數
def prime_numbers():
''' print all the prime numbers btw 2...10000
print the onsumed time
'''
t_start = time.time()
for i in range(2, 10000):
if is_prime(i):
print(i)
t_stop = time.time()
print("time consumed: {}".format(t_stop - t_start))
prime_numbers()
缺點: 統計時間的代碼和業務代碼混在一起寫在prime_numbers()里面
用裝飾器
import time
# 定義一個裝飾器: 統計函式運行時間
def display_time(func):
''' define a decorator函式,引數是函式 '''
def wrapper():
t_start = time.time()
func()
t_stop = time.time()
print("time consumed: {:.4}".format(t_stop - t_start))
return wrapper
# 判斷輸入的num是否是質數
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到10000之間的質數count
@display_time
def prime_numbers():
''' count the prime numbers btw 2...10000 '''
for i in range(2, 10000):
if is_prime(i):
print(i)
prime_numbers() # 運行它的時候實際上運行的是裝飾器函式wrapper()
通過裝飾器實作了業務邏輯與主服務功能的分離
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458482.html
標籤:Python
