• day12 无参装饰器简单实现 无参装饰器升级版(有返回值) 装饰器语法糖 认证功能装饰器实现 叠加多个装饰器 有参装饰器 今日作业


    无参装饰器简单实现

    ''
    1 开放封闭原则
    软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
    也就是说我们必须找到一种解决方案:
    能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能

    总结,
    原则如下:
    1、不修改源代码
    2、不修改调用方式
    目的:
    在遵循1和2原则的基础上扩展新功能

    2、什么是装饰器?
    器指的工具,装饰指的是为被装饰对象添加新功能

    完整含义:
    装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

    装饰器与被装饰的对象均可以是任意可调用的对象

    装饰器=》函数
    被装饰的对象=》函数

    '''
    统计其运行时间
    import time
    def index():
        start_time=time.time()
        time.sleep(3)
        print('welcome to index page')
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
    index()

    无参装饰器完整版

    import time
    def index():
        time.sleep(1)
        print('welcome to index page')
        return 122
    
    def home(name):
        time.sleep(3)
        print('welcome %s to home page'%name)
    
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print(stop_time-start_time)
            return res
        return wrapper
    
    index=timmer(index)
    home=timmer(home)
    
    home(name='egon')
    index()
    
    #无参装饰器模板
    def outter(func):
        def inner(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return inner

    装饰器语法糖

    import time
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print(stop_time-start_time)
            return res
        return wrapper
    
    @timmer #index=timmer(index)
    def index():
        time.sleep(1)
        print('welcome to index page')
        return 122
    
    @timmer # home=timmer(home)
    def home(name):
        time.sleep(2)
        print('welcome %s to home page' %name)
    
    index()
    home('egon')

    认证功能装饰器实现 

    import time
    current_user={
        'username':None,
        # 'login_time':None
    }
    
    def auth(func):
        # func=index
        def wrapper(*args,**kwargs):
            if current_user['username']:
                print('已经登陆过了')
                res=func(*args,**kwargs)
                return res
    
            uname=input('用户名>>: ').strip()
            pwd=input('密码>>: ').strip()
            if uname == 'egon' and pwd == '123':
                print('登陆成功')
                current_user['username']=uname
                res=func(*args,**kwargs)
                return res
            else:
                print('用户名或密码错误')
        return wrapper
    
    @auth #index=auth(index)
    def index():
        time.sleep(1)
        print('welcome to index page')
        return 122
    
    @auth
    def home(name):
        time.sleep(2)
        print('welcome %s to home page' %name)
    
    index()
    home('egon')

    叠加多个装饰器

    import time
    current_user={
        'username':None,
        # 'login_time':None
    }
    
    def auth(func):
        # func=index
        def wrapper(*args,**kwargs):
            if current_user['username']:
                print('已经登陆过了')
                res=func(*args,**kwargs)
                return res
    
            uname=input('用户名>>: ').strip()
            pwd=input('密码>>: ').strip()
            if uname == 'egon' and pwd == '123':
                print('登陆成功')
                current_user['username']=uname
                res=func(*args,**kwargs)
                return res
            else:
                print('用户名或密码错误')
        return wrapper
    
    def timmer(func):
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs)
            stop_time=time.time()
            print(stop_time-start_time)
            return res
        return wrapper
    
    @timmer # timmer 统计的是auth+index的执行时间
    @auth
    def index():
        time.sleep(1)
        print('welcome to index page')
        return 122
    
    index()

    有参装饰器

    import time
    current_user={
        'username':None,
        # 'login_time':None
    }
    
    def auth(engine):
        # engine='file'
        def auth2(func):
            # func=index
            def wrapper(*args,**kwargs):
                if engine == 'file':
                    if current_user['username']:
                        print('已经登陆过了')
                        res=func(*args,**kwargs)
                        return res
    
                    uname=input('用户名>>: ').strip()
                    pwd=input('密码>>: ').strip()
                    if uname == 'egon' and pwd == '123':
                        print('登陆成功')
                        current_user['username']=uname
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('用户名或密码错误')
                elif engine == 'mysql':
                    print('基于MyQL的认证')
                elif engine == 'ldap':
                    print('基于LDAP的认证')
            return wrapper
        return auth2
    
    @auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
    def index():
        time.sleep(1)
        print('welcome to index page')
        return 122
    
    
    index() # wrapper()
    

    今日作业:

    一:编写函数,(函数执行的时间是随机的)

    import time,random
    
    def print_time():
        time.sleep(random.randrange(0,3))
        print(random.randrange(0,3))
    
    print_time()

    二:编写装饰器,为函数加上统计时间的功能


    三:编写装饰器,为函数加上认证的功能

    四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式

    五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录

    六:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果

    七:为题目五编写装饰器,实现缓存网页内容的功能:
    具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中

    扩展功能:用户可以选择缓存介质/缓存引擎,针对不同的url,缓存到不同的文件中

    八:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

    九 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
    注意:时间格式的获取
    import time
    time.strftime('%Y-%m-%d %X')

  • 相关阅读:
    了解DockerFile
    容器数据卷
    Docker镜像讲解
    Java语法学习笔记:多态
    决策树之分类与回归
    python数据分析回归算法
    python之斐波那契序列算法的总结
    pandas 关于数据分组和聚合
    pandas中关于数据合并join,merge
    scrapy爬虫之断点续爬,增量爬取,断网急救
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/10027727.html
Copyright © 2020-2023  润新知