日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:python裝飾器如何實現(xiàn)

1、裝飾器的理解

裝飾器是將一個函數(shù)鑲嵌在另一個函數(shù)中進行重復使用的目的,不改變其結(jié)構(gòu),增加函數(shù)的使用方式,但是不用寫過多冗余的代碼;

裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象。

通常用到的功能:1.引入日志;2.函數(shù)執(zhí)行時間統(tǒng)計;3.執(zhí)行函數(shù)前預備處理;4.執(zhí)行函數(shù)后清理功能;5.權(quán)限校驗;6.緩存

2、實現(xiàn)原理與通用寫法

咱們可以從一個簡單的記錄函數(shù)運行時間的簡單裝飾器,舉一反三,推導出一個通用的裝飾器寫法

import time
 
def timer(func):
    '''
    記錄方法運行時間的裝飾器
    :param func: 方法
    :return:函數(shù)對象
    '''
    def deco(*args, **kwargs):
        startTime = time.time()
        f = func(*args, **kwargs)
        endTime = time.time()
        msecs = (endTime - startTime) * 1000
        print("time is %d ms" % msecs)
        return f # 如果 func 有返回值得話,需要在此return回去,否則,默認返回值為 None,一般默認都返回
 
    return deco
 
 
@timer
def test(parameter):
    print("test is running!")
    time.sleep(1)
    return "Returned value" # 該函數(shù)有返回值,所以需要在 裝飾器中的 deco 方法中 寫返回值
 
 
t = test('aa')
print(t)

python學習網(wǎng),免費的python學習網(wǎng)站,歡迎在線學習!

這是一個很簡單的通用的記錄時間的裝飾器,從而推導出一個通用的裝飾器寫法:

def func_name(func): # 自定義裝飾器函數(shù)名
    def deco(*args, **kwargs): # 將所有參數(shù)原封不動的進行傳遞
        print("在這個分割線之上寫函數(shù)運行前的操作")
#         -----------分割線-----------
        f = func(*args, **kwargs)
#         -----------分割線-----------
        print("在這個分割線之后,return之前,寫函數(shù)運行后的操作")
        return f # 如果 func 有返回值得話,需要在此return回去,否則,默認返回值為 None,一般默認都返回
 
    return deco
 
 
@func_name
def test(parameter):  # 8
    print("test is running!")
    time.sleep(1)
    return "Returned value" # 該函數(shù)有返回值,所以需要在 裝飾器中的 deco 方法中 寫返回值
 
 
t = test('aa')
print(t)

ok 裝飾器到此可以完事了,一般情況下都能滿足需求了,網(wǎng)上看那么多原理,有點兒浪費時間,我偏向?qū)嵅傩?實在不喜歡啰嗦那么多,就是干。

當然在開發(fā)過程中, 我們可能會遇到一些特殊情況,比如參數(shù)問題

1、給裝飾器函數(shù)代參數(shù)(通用)

2、將執(zhí)行函數(shù)的參數(shù)拆分計算等(比如:1000w的數(shù)據(jù),拆分成100份執(zhí)行等)(定制)

那就按順序來

1、寫一個代參數(shù)的裝飾器

def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper
 
@logging(level='INFO')
def say(something):
    print("say {}!".format(something))
 
# 如果沒有使用@語法,等同于
# say = logging(level='INFO')(say)
 
@logging(level='DEBUG')
def do(something):
    print("do {}...".format(something))
 
if __name__ == '__main__':
    say('hello')
    do("my work")

網(wǎng)站標題:創(chuàng)新互聯(lián)Python教程:python裝飾器如何實現(xiàn)
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/ccedhse.html