函数 装饰器

什么是装饰器

  为被装饰器对象添加额外功能的一种工具

为什么用装饰器

  软件维护中应该遵从开放封闭的原则

    封闭源代码,对程序的扩展是开放的

      1、不改变程序的源代码

      2、不改变程序的调用方式

如何用装饰器

1、无参装饰器

运行一个程序,装饰上一个程序运行了几秒钟的工具

import time
def index():
    print('welcom to index')
    time.sleep(3)

def timmer(func):

    def wrapper(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        stop = time.time()
        print('run time is %s' % (stop - start))
    return wrapper

index=timmer(index)
index()

补充:

@加装饰器的变量名 可以直接省略 这个步骤

index=timmer(index)

装饰器固定套路

def deco(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper
 

2、有参装饰器

扫描二维码关注公众号,回复: 1571149 查看本文章

我们可以从固定套路中看出 函数 deco 和func 参数都已经固定死了。如果需要为函数里面传参的话,我么只能在deco函数外面又套一个函数 ,进行传参。

import time

current_user = {'urse': None}


def auth(engine='file'):
    def deco(func):
        def wrapper(*args, **kwargs):
            if current_user['urse']:
                res = func(*args, **kwargs)
                return res
            user = input('username>>:')
            pwd = input('password>>:')
            if engine == 'file':
                if user == 'egon' and pwd == '123':
                    print('login successful')
                    current_user['urse'] = user
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('user or pqssword error')
            elif engine == 'mysql':
                print('基于mysql的认证')
            elif engine == 'ldap':
                print('基于ldap的认证')
            else:
                print('无法识别认证来源')

        return wrapper

    return deco


@auth()
def index():
    print('welcome to index page')
    time.sleep(1)


@auth()
def home(name):
    print('welcome %s to home page' % name)
    time.sleep(1)


index()
home('egon')

猜你喜欢

转载自www.cnblogs.com/zuozhengjun/p/9173903.html
今日推荐