zoukankan      html  css  js  c++  java
  • 010_装饰器

    1,时间
    import time
    print(time.time())      #获取当前时间
    time.sleep(10)          #让程序在执行到这个位置的时候停一会儿
    
      1.1,计算程序运行时间
    import time
    def func():
        start = time.time()
        print('计算时间')
        time.sleep(0.01)
        end = time.time()
        print(end-start)
    func()
    
      1.2,计算程序运行时间优化
    import time
    def timmer(f):
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    
    def func():
        time.sleep(0.01)
        print('计算时间')
    
    timmer(func)
    2,不想修改函数的调用方式,但还想在原来的函数前后添加功能
        timmer()就是一个装饰器函数,只是对一个函数,有一些装饰作用
    import time
    def func():         #被装饰函数
        time.sleep(0.01)
        print('计算时间')
    
    def timmer(f):      #装饰器函数
        def inner():
            start = time.time()
            f()      #被装饰函数
            end = time.time()
            print(end - start)
        return inner
    
    func = timmer(func)
    func()
    
    3,@装饰符的使用
    import time
    
    def timmer(f):      #装饰器函数
        def inner():
            start = time.time()
            f()      #被装饰函数
            end = time.time()
            print(end - start)
        return inner
    
    @timmer     #这个相当于func = timmer(func)这个语句
    def func():         #被装饰函数
        time.sleep(0.01)
        print('计算时间')
    
    #func = timmer(func)
    func()
    
      装饰器函数是一个闭包,因为参数f是函数timmer的变量,所以inner函数是调用的了外部函数的变量,
      因为f是外部函数的变量,根据闭包特性,f得到传参后就会一直是代表传来的参数

    4,装饰器的执行


    5,装饰带参数函数的装饰器
    import time
    
    def timmer(f):      #装饰器函数
        def inner(a):
            start = time.time()
            ret = f(a)      #被装饰函数
            end = time.time()
            print(end - start)
            return ret
        return inner
    
    @timmer
    def func(a):         #被装饰函数
        time.sleep(0.01)
        print('计算时间')
        return '返回值'
    
    #func = timmer(func)
    ret = func(1)
    print(ret)
    

     6,格式整理

    7,查看函数名,注释信息

    def wahaha():
    	'''
    	一个打印哇哈哈的函数
    	:return:
    	'''
    	print('哇哈哈')
    
    print(wahaha.__name__) #查看字符串格式的函数名
    print(wahaha.__doc__) #document
    

     8,问题:函数被装饰过之后不能获得被装饰函数的信息

          解决问题:

    9,带参数的装饰器,三层嵌套

     10,装饰器的进阶

    11,多个装饰器修饰一个函数时

    过程图

  • 相关阅读:
    计算机原理 发展简史
    计算机原理 系统构成
    网络工程师级考试大纲
    软件工程师能力要求
    数据库主体在该数据库中拥有架构,无法删除解决方法
    【转】时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    Rabbit mq订阅方式获取消息并可设置持久化
    OpenGL 核心技术之立方体贴图
    ArcGIS Engine问答:为什么地理数据库中不能产生同名要素类
    Cocos2d-X中的声音和音效
  • 原文地址:https://www.cnblogs.com/eternity-twinkle/p/10501736.html
Copyright © 2011-2022 走看看