• day11 装饰器


    #装饰器形成的过程
    #装饰器的作用
    #原则:开放封闭原则
    #语法糖
    #装饰器的固定模式
    '''import time
    def func():
    time.sleep(2)
    print("sdsgsdgds")

    def timmer(f):
    def inner():
    start = time.time()
    f()
    end = time.time()
    print(end - start)
    return inner
    func = timmer(func)
    func()'''

    # import time
    # def func():
    # time.sleep(2)
    # print("我爱蒲月明")
    # def timmer(f):
    # def inner():
    # start = time.time()
    # f()
    # end = time.time()
    # print(end-start)
    # return inner
    # func = timmer(func)
    # func()
    #装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后添加功能
    #timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用
    import time
    def timmer(f): #装饰器函数
    def inner():
    start = time.time()
    ret = f() #被装饰的函数
    end = time.time()
    print(end-start)
    return ret
    return inner
    @timmer #语法糖
    def func():
    time.sleep(2)
    print("我爱蒲月明")
    return "新年好"
    # func = timmer(func)
    ret = func()
    print(ret)

    #原则:开放封闭原则
    #开放:对扩展是开放的
    #封闭:对修改是封闭的

    def outer():
    def inner():
    return 'inner'
    abc = inner()
    return abc
    k = outer()
    print(k)
    #装饰带参数函数的装饰器
    import time
    def timmer(f): #装饰器函数
    def inner(*args,**kwargs):
    start = time.time()
    ret = f(*args,**kwargs) #被装饰的函数
    end = time.time()
    print(end-start)
    return ret
    return inner
    @timmer #语法糖
    def func(a,b):
    time.sleep(2)
    print("我爱蒲月明",a,b)
    return "新年好"
    def func1(a,b):
    time.sleep(2)
    print("我爱妈妈",a=6,b=7)
    return "新年好"
    # func = timmer(func)
    ret = func(1,2)
    print(ret)

    #装饰器的固定模式
    def wrapper(f): #装饰器函数,f是被装饰的函数
    def inner(*args,**kwargs):
    ret = f(*args,**kwargs) #被装饰的函数
    '''在被装饰函数之后要做的事'''
    return ret
    return inner
    @wrapper #语法糖#装饰器函数名
    def func(a,b):#被装饰的函数
    time.sleep(2)
    print("我爱蒲月明",a,b)
    return "新年好"

    # 进阶作业(选做):
    # 1.编写下载网页内容的函数,要求功能是:用户传入一个url,
    # 函数返回下载页面的结果
    # 2.为题目1编写装饰器,实现缓存网页内容的功能:
    # 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),
    # 就优先从文件中读取网页内容,
    # 否则,就去下载,然后存到文件中
    import os
    from urllib.request import urlopen
    def cache(func):
    def inner(*args, **kwargs):
    if os.path.getsize('web_cache'):
    with open('web_cache','rb') as f:
    return f.read()
    ret = func(*args,**kwargs)
    with open('web_cache','wb') as f:
    f.write(b'********'+ret)
    return ret
    return inner
    @cache
    def get(url):
    code = urlopen(url).read()
    return code

    ret = get('http://www.baidu.com')
    print(ret)
    ret = get('http://www.baidu.com')
    print(ret)
    ret = get('http://www.baidu.com')
    print(ret)


    # 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
    # 要求登录成功一次,后续的函数都无需再输入用户名和密码
    from res import *
    Flag = False
    def login(func):
    def inner(*args,**kwargs):
    global Flag
    '''#登录程序'''
    if Flag:
    ret =func(*args,**kwargs)
    return ret
    else:
    _username = input("input username: ").strip()
    _password = input("input password: ").strip()
    if _username == username and _password == password:
    Flag = True
    ret = func(*args, **kwargs)
    return ret
    else:
    print('登录失败')
    return inner

    @login
    def read():
    print("读一本书")
    @login
    def write():
    print("写一篇文章")

    read()
    write()'''
    #2.编写装饰器,为多个函数加上记录调用功能,
    # 要求每次调用函数都将被调用的函数名称写入文件
    def wrapper(func):
    def innner(*args,**kwargs):
    with open("res","a",encoding="utf-8") as f:
    f.write(func.__name__+' ')
    ret = func(*args,**kwargs)
    return ret
    return innner
    @wrapper
    def fan():
    print('fan')
    @wrapper
    def yzx():
    print("yzx")
    fan()
    yzx()

    # 进阶作业(选做):
    # 1.编写下载网页内容的函数,要求功能是:用户传入一个url,
    # 函数返回下载页面的结果
    # 2.为题目1编写装饰器,实现缓存网页内容的功能:
    # 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),
    # 就优先从文件中读取网页内容,
    # 否则,就去下载,然后存到文件中
    import os
    from urllib.request import urlopen
    def cache(func):
    def inner(*args, **kwargs):
    if os.path.getsize('web_cache'):
    with open('web_cache','rb') as f:
    return f.read()
    ret = func(*args,**kwargs)
    with open('web_cache','wb') as f:
    f.write(b'********'+ret)
    return ret
    return inner
    @cache
    def get(url):
    code = urlopen(url).read()
    return code

    ret = get('http://www.baidu.com')
    print(ret)
    ret = get('http://www.baidu.com')
    print(ret)
    ret = get('http://www.baidu.com')
    print(ret)
  • 相关阅读:
    30 张图详解操作系统总结!
    Redis配置与优化
    SpringBoot中使用@Async注解使用及其失效问题解决 规格严格
    Key exchange was not finished,connection is closed近期遇到这个错误sshd更新导致的 规格严格
    java SpringBoot注解@Async不生效的解决方法 规格严格
    Kafka Producer配置 规格严格
    SpringBoot项目迁移到tongweb 规格严格
    Spring Boot系列二 Spring @Async异步线程池用法总结 规格严格
    OutOfMemoryError: GC Overhead Limit Exceeded错误解析 规格严格
    SQL语句update set 嵌套 case when以及MyBatis中的写法 规格严格
  • 原文地址:https://www.cnblogs.com/Murraya/p/10699918.html
Copyright © 2020-2023  润新知