day26:裝飾器

李博倫發表於2020-08-07

裝飾器

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("孫致和","鳥窩")

 

相關文章