装饰器补充与有参装饰器
一、 装饰器补充
functools模块下提供的一个装饰器wraps用于用于将装饰器的wrapper函数的文档注释于函数名属性修改得和原函数的一模一样,使wrapper函数完全和原函数相同。
from functools import wraps
def outter(func):
@wraps(func) #省去了在函数体内手动的修改文档注释及函数名功能
def wrapper(*args,**kwargs):
""""这是一个主页功能"""
res=func(*args,**kwargs)
return res
return wrapper
@outter #index=outter(index)
def index(x,y):
"""这是一个主页功能"""
print(x,y)
print(index.__name__)
print(index.__doc__)
二、用语法糖实现有参装饰器
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': #函数内需要一个db_type的参数
print('基于文件的验证')
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的验证')
elif db_type == 'ldap':
print('基于ldap的验证')
else:
print('不支持该db_type')
return wrapper
return deco
函数wrapper需要一个db_type参数,而函数deco与wrapper的参数都有其特定的功能,不能用来接受其他类别的参数,可以在deco的外部再包一层函数auth,用来专门接受额外的参数,这样便保证了在auth函数内无论多少层都可以引用到
@auth(db_type='file') # @deco # index=deco(index) # index=wrapper
def index(x, y):
print('index->>%s:%s' % (x, y))
print(x,y)
@auth(db_type='mysql') # @deco # home=deco(home) # home=wrapper
def home(name):
print('home->>%s' % name)
@auth(db_type='ldap') # 账号密码的来源是ldap
def transfer():
print('transfer')
index(1, 2)
home('egon')
transfer()
有参装饰器模版
def 有参装饰器(x,y,z):
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return outter
@有参装饰器(1,y=2,z=3)
def 被装饰对象():
pass
def 有参装饰器(x,y,z):
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return outter
@有参装饰器(x=1,y=2,z=3)
def 被装饰对象()
pass
#被装饰对象(4,5,6)