zoukankan      html  css  js  c++  java
  • day12 装饰器

    装饰器

    装饰器的作用
    在不改变函数的调用方式的情况下,给函数的前后添加新功能

    复制代码
    # 关于时间
    import time  # 模块
    # time.sleep(1)
    # print(time.time())
    # print('===========')
    
    # def timmer(func):
    #     start_time = time.time()
    #     time.sleep(0.1)
    #     func()
    #     end_time = time.time()
    #     print('=====%s====='%(end_time-start_time))
    
    def timmer(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
        def inner():  # 在装饰器中需要定义一个内部函数
            print('调用func之前')
            func()  # 被装饰的函数,并且要执行
            print('调用func之后')
        return inner  # 将内部函数的名字返回
    
    @timmer  # 语法糖 func = timmer(func)
    def func():
        print('ok')
    
    func()
    复制代码

    有参装饰器

    复制代码
    def timmer(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
        def inner(*args,**kwargs):  # 在装饰器中需要定义一个内部函数
            print('调用func之前')
            func(*args,**kwargs)  # 被装饰的函数,并且要执行
            print('调用func之后')
        return inner  # 将内部函数的名字返回
    
    @timmer  # 语法糖 func = timmer(func)
    def func(name):
        print('%sok'%name)
    
    @timmer
    def func2(a,b):
        print('func2:%s'%(a+b))
    
    func('Y')
    func2(5,3)  # inner(5,3)
    复制代码

    有返回值的装饰器

    复制代码
    def timmer(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
        def inner(*args,**kwargs):  # 在装饰器中需要定义一个内部函数
            print('调用func之前')
            ret = func(*args,**kwargs)  # 被装饰的函数,并且要执行
            print('调用func之后')
            return ret
        return inner  # 将内部函数的名字返回
    
    @timmer  # 语法糖 func = timmer(func)
    def func(name):
        print('%sok'%name)
        return 11
    
    ret = func(name='yxt')
    print(ret)
    复制代码

    装饰器的固定结构

    复制代码
    def wrapper(func):  # timmer是装饰器的名字,传入的参数就是被装饰的函数
        def inner(*args,**kwargs):  # 在装饰器中需要定义一个内部函数
            '''被装饰函数执行之前要添加的代码'''
            ret = func(*args,**kwargs)  # 被装饰的函数,并且要执行
            '''被装饰函数执行之后要添加的代码'''
            return ret
        return inner  # 将内部函数的名字返回
    复制代码

    开放封闭原则
    开放:
    对扩展是开放的
    封闭:
    对修改是封闭的
    装饰器:开放封闭原则

    装饰器实例

    复制代码
    flag = False
    def login(func):
        def inner(*args,**kwargs):
            global flag
            if flag == False:
                username = input('用户名:')
                password = input('密码:')
                if username == 'alex' and password == 'somebody':
                    print('登录成功')
                    flag = True
            if flag == True:
                ret = func(*args,**kwargs)
                return ret
        return inner
    
    @login
    def art():
        print('欢迎来到文章页')
    
    @login
    def dar():
        print('欢迎来到日记页')
    
    art()
    dar()
    复制代码
  • 相关阅读:
    Where条件的in里面放太多数据导致很慢
    获取项目文件目录下的所有文件路径
    如何将数据转换成XML格式
    微信6.2开发笔记
    sql server 2008导出数据注意事项
    IIS7.5下404错误设置失效的问题
    采用ASP.NET IIS 注册工具 (Aspnet_regiis.exe)对web.config实行本地加密
    webkit自定义滚动条
    ueditor1_4_3-utf8-net使用笔记
    WebDev.WebServer40.exe已停止工作
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7772371.html
Copyright © 2011-2022 走看看