装饰器

装饰器:定义一个函数,为其他函数添加额外功能

def index(x,y,z):
    print(x,y,z)
def outter(func):
    def wrapper(*args,**kwargs):
        import time
        start = time.time()
        res = func(*args,**kwargs)
        end = time.time()
        return res
    return wrapper
index = outter(index)
index(1,2,3)

开放封闭原则:拓展功能开放,修改源码封闭

语法糖:@timmer

def auth(func):
    def wrapper(*args,**kwargs):
        # 1、调用原函数
        # 2、为其增加新功能
        name=input('your name>>: ').strip()
        pwd=input('your password>>: ').strip()
        if name == 'egon' and pwd == '123':
            res=func(*args,**kwargs)
            return res
        else:
            print('账号密码错误')
    return wrapper



@auth
def index():
    print('from index')

index()
@func
把下面的函数名传入@后面的函数名加括号的里面的参数,然后将返回值赋值给下面的函数名

wrapper.__name__ = func.__name__
wrapper.__doc__ = func.__doc__

from functools import wraps

在wrapper定义上再加装饰器
@wraps(func)

wapper改了参数,那index调用的时候也得变,那就不符合要求了

有参装饰器:

from functools import wraps

def auth(x1,y1,z1):
    def outter(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            import time
            start = time.time()
            res = func(*args,**kwargs)
            end = time.time()
            print(x1,y1,z1)
            return res
        return wrapper
    return outter

@auth(0,0,0)
def index(x,y,z):
    print(x,y,z)

index(1,2,3)
print(index.__name__)

装饰器调用:
加载顺序:自下而上
最终index就是最外层的wrapper

执行顺序:从外层到内层

原文地址:https://www.cnblogs.com/pythonwl/p/12553169.html