zoukankan      html  css  js  c++  java
  • Python基础之装饰器

      一、 什么是装饰器:

      器即函数;

      装饰即修饰,意指为其他函数添加新功能。

      装饰器定义:本质就是函数,功能是为其他函数添加新功能。

      二、装饰器需要遵循的原则:

      1.不修改被装饰函数的源代码(开放封闭原则);

      2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。

      三、无参装饰器:

      不用传参数来使用装饰器。

      以下的操作是为函数foo来增加新的计时功能:不改变原函数的代码和调用方式

    import time #调用time模块
    
    def timmer(func): #装饰器timmer,将函数foo的函数名为参数传给timmer
        def wrapper():#嵌套函数
            start_time = time.time()#开始时间
            func() #func=函数foo 加括号函数直接被调用
            stop_time = time.time() #结束时间
            print("函数运行的时间是%s"%(stop_time-start_time))
        return wrapper #返回wrapperde
    
    @timmer #装饰器的语法@+装饰器名,foo = timmer(foo)
    def foo(): #定义的一个无参函数
        time.sleep(2) #使程序睡眠2s
        print("welcome to beijing")
    
    foo() #调用foo函数
    ---------------------以下是输出结果----------------------
        welcome to beijing
        函数运行的时间是2.0
    

      四、有参装饰器:

      要传参数来使用装饰器。

      以下的操作是为函数my_max来增加新的计时功能,通过装饰器传的参数判断,执行对应的代码,实现相应的功能:

    不改变原函数的代码和调用方式。

    import time  # 调用time模块
    #定义装饰器阶段
    def choice(x=1): #通过装饰器传的参数(默认为1),完成下面的判断,达到自己想要的状态
        def timmer(func):  # 嵌套函数
            def wrapper(*args, **kwargs):  # 接收参数
                if x == 1: #当装饰器传的参数是1时,就启用计时功能
                    start_time = time.time()  # 开始计时
                    func(*args, **kwargs)  # func=函数my_max 加括号来调用函数
                    stop_time = time.time()  # 结束计时
                    print("函数的运行时间是%s" % (stop_time - start_time))
                elif x == 0: #当装饰器传的参数是0时,就不启用计时功能
                    func(*args, **kwargs)  # func=函数my_max 加括号来调用函数
                    print("不用计时")
            return wrapper  # 返回wrapper
        return timmer #返回timmer
    #调用装饰器
    @choice()#要加括号传参数运行函数的  #@timmer  my_max=timmer(my_max)#为my_max这个函数增加计时功能
    def my_max(x, y):  # 比较两个数的大小
        time.sleep(2)  # 睡眠2s,方便实验效果
        res = x if x > y else y  # 判断x与y的大小
        print("from the my_max,the max is %s" % res)
    #调用函数阶段
    my_max(1, 2)  # 调用函数并按位置传参
    -----------------------输出结果----------------------
    from the my_max,the max is 2  #这是使用的默认参数的结果
    函数的运行时间是2.0
    #当@choice(0) 时
    -----------------------输出结果----------------------
    from the my_max,the max is 2 #choice传的参数是0的结果
    不用计时
    

      

  • 相关阅读:
    为ccflow增加禁用用户立刻生效功能
    关于工作流引擎授权问题的需求变更
    sql server 2005 安装过程中出现错误Insatalling performance countter: Cannot create a file when that file already exists.
    web.config中错误
    三个SQL视图查出所有SQL Server数据库字典
    恢复备份的数据库
    sql语句读取excel数据
    It is an error to use a section registered allowDefinition='MachineToApplication' beyond application level. 错误
    DOS命令实现创建文件夹
    如何查看sql server 的版本(网摘)
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/6689351.html
Copyright © 2011-2022 走看看