Learn Python—函數(裝飾器)

來源:互聯網
上載者:User

標籤:timer   開放封閉原則   gpo   blog   文法   too   作用   文法糖   添加   

裝飾器開放封閉原則

開放:對函數的擴充是開放的

封閉:對函數的修改是封閉的

裝飾器的作用

在不更改原函數調用方式的前提下,對原函數添加新功能

# ①引子——為什麼要有裝飾器為了在不修改原函數的基礎上為函數添加新功能,產生了裝飾器# ②簡單裝飾器def deco(f):    def wrapper():        """原函數前添加的功能"""        f()        """原函數後添加的功能"""    return wrapperdef func():    print(‘這是原函數!‘)func = deco(func)func()# ③裝飾器的文法糖def deco(f):    def wrapper():        """原函數前添加的功能"""        f()        """原函數後添加的功能"""    return wrapper@deco # ——>此處效果等同於 func = deco(func)def func():    print(‘這是原函數‘)func()# ④帶傳回值的裝飾器def deco(f):    def wrapper():        """原函數前添加的功能"""        res = f()        """原函數後添加的功能"""        return res    return wrapper@decodef func():    print(‘這是原函數‘)func()# ⑤帶參數、帶傳回值的裝飾器def deco(f):    def wrapper(*args,**kwargs):        """原函數前添加的功能"""        res = f(*args,**kwargs)        """原函數後添加的功能"""        return res    return wrapper@decodef func(*args,**kwargs):    print(‘這是原函數‘)func(*args,**kwargs)# ⑥多層裝飾器# todo# ⑦多個裝飾器修飾同一個函數# todo
裝飾器的固定格式
def deco(f):    def wrapper(*args,**kwargs):    """原函數前添加的功能"""    res = f(*args,**kwargs)    """原函數後添加的功能"""    return res    return wrapper@decodef func(*args,**kwargs):    pring(‘這是原函數‘)func(*args,**kwargs)
裝飾器的固定格式—wraps版

如果想使用原函數的雙下方法,則需要再調用系統裝飾器@ wraps(func)

from functools import wrapsdef deco(func):    @wraps(func) #加在最內層函數正上方    def wrapper(*args,**kwargs):        return func(*args,**kwargs)    return wrapper@decodef origin_func():    ‘‘‘    這是原函數的注釋    :return:    ‘‘‘    print(‘這是原函數‘)# 雖然已經執行了裝飾器,origin_func已經指向wrapper,但是如果用了@wraps(func)裝飾器之後調用origin_func的雙下方法依然是原函數origin_func的print(origin_func.__name__)>>> origin_funcprint(origin_func.__doc__)>>> 這是原函數的注釋>>> :return:
帶參數的裝飾器
def outer(flag):    def timer(func):        def inner(*args,**kwargs):            if flag:                print(‘‘‘執行函數之前要做的‘‘‘)            re = func(*args,**kwargs)            if flag:                print(‘‘‘執行函數之後要做的‘‘‘)            return re        return inner    return timer# 此處先執行函數調用outer(False) —> 返回timer —>@timer —>func = timer(func) —> func = inner@outer(False) def func():    print(111)func()
多個裝飾器裝飾同一個函數
def wrapper1(func):    def inner1():        print(‘wrapper1 ,before func‘)        func()        print(‘wrapper1 ,after func‘)    return inner1def wrapper2(func):    def inner2():        print(‘wrapper2 ,before func‘)        func()        print(‘wrapper2 ,after func‘)    return inner2@wrapper2 # 將inner1進行裝飾,即inner1 = wrapper2(inner1) = inner2@wrapper1 # 先執行這個裝飾器,即f = wrapper1(f) = inner1def f():    print(‘in f‘)f()# 結果>>> wrapper2 ,before func>>> wrapper1 ,before func>>> in f>>> wrapper1 ,after func>>> wrapper2 ,after func

 

Learn Python—函數(裝飾器)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.