目錄 一、前置知識(shí)1.1 無參裝飾器模板def outter(func):
def wrapper(*args,**kwargs):
# 1、調(diào)用原函數(shù)
# 2、給原函數(shù)增加新的功能
res=func(*args,**kwargs)
# 3、給原函數(shù)增加新的功能
return res
return wrapper
@outter # index=outter(index)
def index(x,y):
"""這個(gè)是主要功能"""
print(x,y)
print(index) # <function outter.<locals>.wrapper at 0x0000027FF77B20D0>
print(index.__name__) # wrapper,實(shí)際上還是wrapper函數(shù)
print(help(index)) # wrapper的文檔注釋如下:
'''
Help on function wrapper in module __main__:
wrapper(*args, **kwargs)
這個(gè)是主要功能
None
'''
# 經(jīng)裝飾之后的函數(shù),還是沒有完全偽裝的跟原函數(shù)一樣,需要繼續(xù)優(yōu)化
1.2 裝飾器wraps#偷梁換柱,即將原函數(shù)名指向的內(nèi)存地址偷梁換柱成wrapper函數(shù),所以應(yīng)該將wrapper做的跟原函數(shù)一樣才行
from functools import wraps # 引入functools模塊下的裝飾器wraps
def outter(func):
@wraps(func) # functools模塊下提供的裝飾器wraps,可以實(shí)現(xiàn)保留原函數(shù)屬性的操作
def wrapper(*args,**kwargs):
# 1、調(diào)用原函數(shù)
# 2、給原函數(shù)增加新的功能
res=func(*args,**kwargs)
# 3、給原函數(shù)增加新的功能
return res
return wrapper
二、有參裝飾器2.1 有參裝飾器的實(shí)現(xiàn)若在無參裝飾器的基礎(chǔ)上,再實(shí)現(xiàn)一個(gè)用來為被裝飾對(duì)象添加認(rèn)證功能的裝飾器,需要在deco外部再包一層函數(shù)auth,用來專門接受額外的參數(shù),這樣便保證了在auth函數(shù)內(nèi)無論多少層都可以引用到。 def auth(db_type):
def deco(func):
def wrapper(*args, **kwargs):
name = input('your name>>>: ').strip()
pwd = input('your password>>>: ').strip()
if db_type == 'file':
print('基于文件的驗(yàn)證')
if name == 'egon' and pwd == '123':
res = func(*args, **kwargs) # index(1,2)
return res
else:
print('user or password error')
elif db_type == 'mysql':
print('基于mysql的驗(yàn)證')
elif db_type == 'ldap':
print('基于ldap的驗(yàn)證')
else:
print('不支持該db_type')
return wrapper
return deco
@auth(db_type='file') # @deco # index=deco(index) # index=wrapper
def index(x, y):
print('index->>%s:%s' % (x, y))
@auth(db_type='mysql') # @deco # home=deco(home) # home=wrapper
def home(name):
print('home->>%s' % name)
@auth(db_type='ldap') # 賬號(hào)密碼的來源是ldap
def transfer():
print('transfer')
index(1, 2)
home('egon')
transfer()
2.2 有參裝飾器模板def 有參裝飾器(x,y,z):
def outter(func):
def wrapper(*args, **kwargs):
# 1、為其增加新功能
res = func(*args, **kwargs)
return res
# 2、調(diào)用原函數(shù)后為其增加其他新功能
return wrapper
return outter
@有參裝飾器(1,y=2,z=3)
def 被裝飾對(duì)象():
pass 來源:https://www./content-1-666251.html
|