裝飾器詳解
簡單實例教程
需要裝飾的函數(shù)
def login(username, password):
print(username, password)
裝飾器的參數(shù)是方法名,就是被裝飾的函數(shù)
def decorator(func):
# 在定義一個函數(shù)用于實現(xiàn)裝飾,參數(shù)要和被裝飾的函數(shù)一樣
def new_login(username, password):
# 共性代碼
print(username)
# login函數(shù)特有代碼
func(username, password)
# 共性代碼
print(password)
# 執(zhí)行new_login函數(shù)
return new_login
被裝飾的函數(shù)需要這樣寫
@decorator
def login(username, password):
print(username, password)
調(diào)用
login("你打球真像蔡徐坤", "你雞太美")
結(jié)果
在這里插入圖片描述
裝飾器原理
裝飾器函數(shù)
def decorator(func):
# 在定義一個函數(shù)用于實現(xiàn)裝飾,參數(shù)要和被裝飾的函數(shù)一樣
def new_login(username, password):
# 共性代碼
print(username)
# login函數(shù)特有代碼
func(username, password)
# 共性代碼
print(password)
# 執(zhí)行new_login函數(shù)
return new_login
被裝飾函數(shù)
def login(username, password):
print(username, password)
# 此操作等于在函數(shù)名上加@decorator
login = decorator(login)
login("你打球真像蔡徐坤", "你雞太美")
結(jié)果
在這里插入圖片描述
小結(jié)
==A:login B:decorator C:new_login==
裝飾器的原理是:將函數(shù)A的函數(shù)名作為函數(shù)B的參數(shù)傳入,函數(shù)B的函數(shù)體中重新定義一個函數(shù)C,函數(shù)C是函數(shù)A的重寫,在C的函數(shù)體中調(diào)用函數(shù)A,前后都可以擴充代碼,達到重寫函數(shù)A的目的,最后函數(shù)B將函數(shù)C返回賦予A,使得A被重寫成C函數(shù),調(diào)用被裝飾的A函數(shù),實質(zhì)就是調(diào)用C函數(shù)