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()
    复制代码
  • 相关阅读:
    深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列
    消息队列使用的四种场景介绍
    《深入理解Java函数式编程》系列文章
    搭建微服务框架(Spring Boot + Dubbo + Docker + Jenkins)
    spring boot 整合dubbo
    IDEA中使用springBoot+gradle构建多模块项目
    Mac上zookeeper的安装与启动
    redis常用客户端命令
    mac下安装、配置redies
    轻松看懂机器学习常用算法
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7772371.html
Copyright © 2011-2022 走看看