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)
    

     

      

  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/cherrycui/p/10186141.html
Copyright © 2011-2022 走看看