装饰器补充与有参装饰器

一、 装饰器补充

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)

猜你喜欢

转载自www.cnblogs.com/zhangtieshan/p/12562946.html