zoukankan      html  css  js  c++  java
  • python 基础 day04—装饰器

    装饰器

    定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能

    原则:

    • 不能修改被装饰的函数的源代码
    • 不能修改被装饰的函数的调用方式

    示例1

    import time
    def timmer(func): 
        def warpper(*args,**kwargs):
            start_time = time.time()
            func()
            stop_time = time.time()
            print("the func run time is %s" %(stop_time - start_time))
        return warpper
    
    
    @timmer  
    def test1():
        time.sleep(3)
        print("in the test1")
    
    test1()

    从示例1中我们可以看出装饰器符合上诉定义和原则

    实现装饰器的知识储备如下:

    • 函数即“变量”
    • 高阶函数

        a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加功能)

        b.返回值中包含函数名(不修改函数的调用方式)

    • 嵌套函数

    综上  

      高阶函数+嵌套函数==》装饰器

    接下来我们来分析一下上面例子

    无参装饰器

    import time
    def timmer(func):  #装饰器  func=test1—>timmer(test1)
        def warpper():
            start_time = time.time()
            func()
            stop_time = time.time()
            print("the func run time is %s" %(stop_time - start_time))
        return warpper
    
    
    @timmer  # test1=timmer(test1)=warpper
    def test1():
        time.sleep(3)
        print("in the test1")
    
    test1()
    

     执行步骤:

    1.执行装饰器@timmer ,@timmer相当于test1=timmer(test1),

      把test1传进timmer(),返回warpper

      所以test1=timmer(test1)=warpper

    2.执行test1(),test1()=warpper()

      执行warpper()

      同时因为func为形参test1为传进timmer()的实参

      所以func()=test1()

    warpper()执行过程为:

      1.获取开始时间

      2.执行func()=test1()

      3.获取结束时间

      4.打印信息

    固定参数装饰器

    # cherry cui
    import time
    def timmer(func):  #装饰器  func=test2—>timmer(test2)
        def warpper(name):
            start_time = time.time()
            func(name)
            stop_time = time.time()
            print("the func run time is %s
    " %(stop_time - start_time))
        return warpper
    
    
    @timmer  #test2=timmer(test2)=warpper 所以test2(name)=warrpper(name)
    def test2(name):
        time.sleep(2)
        print("name:",name)
    
    
    test2("cherry")
    

      

     不固定参数装饰器

    import time
    def timmer(func):  #装饰器  func=test1—>timmer(test1)
        def warpper(args,*kwargs):
            start_time = time.time()
            func(args,*kwargs)
            stop_time = time.time()
            print("the func run time is %s
    " %(stop_time - start_time))
        return warpper
    
    
    @timmer
    def test2(name,age):
        time.sleep(2)
        print("name:",name)
        print("age:", age)
    
    
    test2("cherry",17)
    

      

    *args,**kwargs可接受存在或不存在的参数

    因此

    一个可有参和无参都适用的装饰器

    import time
    def timmer(func):  #装饰器  func=test1—>timmer(test1)
        def warpper(*args,**kwargs):
            start_time = time.time()
            func(*args,**kwargs)
            stop_time = time.time()
            print("the func run time is %s
    " %(stop_time - start_time))
        return warpper
    
    
    @timmer  #test1=timmer(test1)
    def test1():
        time.sleep(3)
        print("in the test1")
    
    @timmer
    def test2(name,age):
        time.sleep(2)
        print("name:",name)
        print("age:", age)
    
    
    test1()
    test2("cherry",17)
    

     

      

  • 相关阅读:
    Windows编译openssl3
    【转】FFmpeg采集设备
    构建FFmpeg项目时链接报错avformat_alloc_context未定义
    anaconda代理设置
    静态链接导致的一个bug分析
    Qt如果发送信号过快会如何?
    关闭Edge浏览器多窗口Alt+Tab组合键切换
    [转]Windows上的valgrinddeleaker
    在qt项目中编译错误error ::clock未声明
    使用单元测试驱动开发的方式编写flask应用
  • 原文地址:https://www.cnblogs.com/cherrycui/p/10186141.html
Copyright © 2011-2022 走看看