day26:裝飾器

裝飾器

1.裝飾器 : 為原函數去擴展新功能,用新函數去替換舊函數

2.作用 : 在不改變原程式碼的前提下,實現功能上的擴展

3.符號 : @(語法糖)

1.裝飾器的基本用法

# 1.裝飾器的基本用法
'''裝飾器是基於閉包函數來實現的'''
def kuozhan(func):
    def newfunc():
        print("廁所前,蓬頭垢面")
        func()
        print("廁所後,精神抖擻")
    return newfunc


def func():
    print("我是宋雲傑")

'''kuozhan()的返回值是newfunc,newfunc替換了func'''
func = kuozhan(func) # func = newfunc 
'''所以調用func就是相當於在調用newfunc'''
func() # newfunc() 

2.@符號的使用

@符號作用:

(1) 可以自動把@符號下面的函數當成參數傳遞給裝飾器

(2) 把新函數返回,讓新函數去替換舊函數,以實現功能上的擴展(基於原函數)

# 2.@符號的使用
"""
@符號作用:
    (1) 可以自動把@符號下面的函數當成參數傳遞給裝飾器
    (2) 把新函數返回,讓新函數去替換舊函數,以實現功能上的擴展(基於原函數)
"""

def kuozhan(func):
    def newfunc():
        print("廁所前,牛頭馬面")
        func()
        print("廁所後,黑白無常")
    return newfunc

'''1.把func當做參數傳遞給裝飾器kuozhan'''
'''2.將新函數newfunc返回替換舊函數func,進而實現功能的擴展'''
@kuozhan
def func():
    print("我是高雪峰")
func()

3.裝飾器的嵌套

# 3.裝飾器的嵌套
def kuozhan1(func):
    def newfunc():    
        print("廁所前,人模狗樣1")
        func()
        print("廁所後,斯文敗類2")
    return newfunc
    
def kuozhan2(func):
    def newfunc():
        print("廁所前,洗洗手3")
        func()
        print("廁所後,簌簌口4")
    return newfunc
    
@kuozhan2
@kuozhan1
def func():
    print("我是葛龍0")

func()

4.用裝飾器擴展帶有參數的原函數

# 4.用裝飾器擴展帶有參數的原函數
def kuozhan(func):
    def newfunc(who,where):
        print("廁所前,萎靡不振")
        func(who,where)
        print("廁所後,獸性大發")
        
    return newfunc

@kuozhan
def func(who,where):
    print("{}在{}解手".format(who,where))

func("孫致和","鳥窩") # func = newfunc => func("孫致和","鳥窩") <=> newfunc("孫致和","鳥窩")