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()
    复制代码
  • 相关阅读:
    FineBI与power BI,一个是国外风生水起的微软巨头,一个是方兴未艾的国产BI厂商领导者
    Linux下的crontab定时执行任务命令详解举例
    手把手教你搭建SSH框架(Eclipse版)
    一、连接池的定义
    centos安装sftp服务win搭建 sftp 服务器
    前往阿里云的企业优惠活动页面
    世界可能是思想最为混乱的时候,无论你说什么
    python面向对象编程class1
    Python 文件I/O 文件读写模式r,r+,w,w+,a,a+的区别
    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7772371.html
Copyright © 2011-2022 走看看