裝飾器

一、裝飾器的語法:

@裝飾器

開放封閉原則:軟件實體應(yīng)該是可擴展,而不可修改的。也就是說,對擴展是開放的,而對修改是封閉的。

二、裝飾器的作用:

在不更改原功能函數(shù)內(nèi)部代碼,并且不改變調(diào)用方法的情況下為原代碼添加新的功能。

三、裝飾器的原理:

@decorator 等同于 ===> work1 = decorator(work1)

四、普通裝飾器

def decorator(func):
    def wrapper():
        print("---開機,打開軟件--")
        func()
        print("---關(guān)機,底薪到手---")
    return wrapper

@decorator# 作用 @decorator 等同于 ===> work1 = decorator(work1)
def work1():
    print("----寫代碼---")
work1()

五、裝飾有參數(shù)和返回值的餐宿

5-1:實現(xiàn)傳參

import time

def count_time(func):
    def wrapper(a,b):
        strat_time = time.time()
        func(a,b)
        end_time = time.time()
        t_time = end_time - strat_time
        print('運行總時間:%s' % t_time)
    return wrapper

@count_time
def work(a,b):
    time.sleep(2)
    e = a + b
    return e
d = work(2,3)
print(d)
image.png

5-2:實現(xiàn)被裝飾函數(shù)返回值

調(diào)用功能函數(shù),接收功能函數(shù)返回的結(jié)果,裝飾器執(zhí)行完返回結(jié)果

def count_time(func):
    def wrapper(a,b):
        # 獲取開始時的時間
        strat_time = time.time()
        result = func(a,b)
        end_time = time.time()
        t_time = end_time - strat_time
        print('運行總時間:%s' % t_time)
        return result
    return wrapper

@count_time
def work(a,b):
    time.sleep(2)
    e = a + b
    return e
d = work(2,3)
print(d)
image.png

六:裝飾器裝飾類

"""
閉包形式的裝飾器裝飾類:可以在類實例對象的時候,進行功能擴展
"""
"""
閉包形式的裝飾器裝飾類:可以在類實例對象的時候,進行功能擴展
"""
def decorator(item):
    def wrapper(*args,**kwargs):
        print("裝飾器擴展代碼1")
        result = item(*args,**kwargs)
        result.name = "木森"
        print("裝飾器擴張代碼2")
        return result
    return wrapper


@decorator #Mytest = decorator(Mytest)
class Mytest:
    a = 100

print("Mytest:",Mytest)
print()
print("asb",Mytest())
image.png

七:解決裝飾器副作用--wraps函數(shù)

import time
from functools import wraps
def count_time(fun):
    @wraps(fun)
    def wrapper(*args,**kwargs):
        st = time.time()
        # 調(diào)用原功能函數(shù),并使用result接受返回值
        result = fun(*args,**kwargs)
        et = time.time()
        print("函數(shù)執(zhí)行時間:",fun.__name__)
        # 裝飾器中的代碼執(zhí)行完后,將原功能函數(shù)的結(jié)構(gòu)返回出去
        return result
    return wrapper


@count_time
def work(a,b):
    """work函數(shù)"""
    res = a+b
    time.sleep(2)
    return res

@count_time
def work2():
    """work2函數(shù)的文檔注釋"""
    for i in range(3):
        time.sleep(1)

@count_time
def work3(aa,bb,cc,d,e,f,r,y = 999):
    """work3函數(shù)的注釋"""
    print(aa,bb,cc,d,e,f,r,y)

# print(work(1,2))
# print(work2())
# 裝飾器裝飾之后會產(chǎn)生的副作用,無法獲取原功能函數(shù)的特殊屬性
print(work.__name__,work.__doc__)
print(work2.__name__,work2.__doc__)
print(work3.__name__,work3.__doc__)
image.png

八:裝飾器傳參

def decorator(name):
    """最外層的參數(shù),接受裝飾器傳進來的值"""
    def wrapper2(func):
        """第二層參數(shù)func,接收被裝飾器的函數(shù)"""
        def wrapper3(*args,**kwargs):
            """第三層參數(shù),接受被裝飾的函數(shù),被調(diào)用時傳進來的參數(shù)"""
            print("裝飾器擴展的功能代碼1")
            res = func(*args,**kwargs)
            print("裝飾器擴展的功能代碼2")
            return res
        return wrapper3
    return wrapper2


@decorator("musen")
def work():
    return "66666666"
print(work())
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一 裝飾器介紹 1.1 為何要用裝飾器 軟件的設(shè)計應(yīng)該遵循開放封閉原則,即對擴展是開放的,而對修改是封閉的。對擴展...
    100斤的瘦子_湯勇閱讀 625評論 0 0
  • 一、裝飾器的基本使用 在不改變函數(shù)源代碼的前提下,給函數(shù)添加新的功能,這時就需要用到“裝飾器”。 0.開放封閉原則...
    NJingZYuan閱讀 618評論 0 0
  • 00. 裝飾器簡介 在編程領(lǐng)域,有兩個原則是必須遵守的,具體就是開放封閉的原則,具體如下: 封閉:已實現(xiàn)的功能代碼...
    InsaneLoafer閱讀 135評論 0 1
  • 引入 定義函數(shù)和定義變量是類似的,變量名綁定的是值的內(nèi)存地址,而函數(shù)名綁定的是代碼塊的內(nèi)存地址,函數(shù)也可以像變量一...
    程序媛小莊閱讀 388評論 0 2
  • 閉包 閉包需要滿足什么條件?(面試常問)1.函數(shù)中嵌套一個函數(shù)2.外層函數(shù)的返回值是內(nèi)嵌函數(shù)的函數(shù)名3.內(nèi)嵌函數(shù)對...
    豬兒打滾閱讀 446評論 2 0

友情鏈接更多精彩內(nèi)容