zoukankan      html  css  js  c++  java
  • python中的装饰器基础

    1.计算一个程序执行需要多长时间

     1 import time
     2 #time.time()      1970纪元后经过的浮点秒数
     3 #time.sleep(10)       让程序执行到这个位置的时候停一会儿
     4 
     5 def func():
     6     start = time.time()
     7     print('测试程序的执行时间为多少')
     8     end = time.time()
     9     res = end - start
    10     print(res)
    11 func()

    为了更好的调用

     1 import time
     2 
     3 def timeer(f):
     4     start = time.time()
     5     f()
     6     end = time.time()
     7     res = end - start
     8     print(res)
     9 
    10 
    11 def func():
    12     time.sleep(0.01)       #为了更精准的测出时间
    13     print('测试程序的执行时间为多少')
    14 
    15 timeer(func)

    改进

     1 import time
     2 
     3 def func():
     4     time.sleep(0.01)
     5     print('测试软件')
     6 
     7 def timmer(f):           #装饰器函数
     8     def inner():
     9         start = time.time()
    10         f()              #被装饰的函数
    11         end = time.time()
    12         print(end - start)
    13     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
    14 
    15 
    16 func = timmer(func)
    17 func()
    #不想修改函数的调用方式 但是还想在原来的函数前后添加功能
    #timmer就是一个装饰器函数只是对一个函数有一些装饰作用

    通过闭包函数返回内部函数的名字,然后在外部接收它,让外部接收的变量与外部的函数保持一致,
    然后函数名加上括号就会自动的去调用内部的函数

    3.开放封闭原则

      开放:对扩展是开放的
    封闭:对修改时封闭的
     1 import time
     2 
     3 def timmer(f):           #装饰器函数
     4     def inner():
     5         start = time.time()
     6         f()              #被装饰的函数
     7         end = time.time()
     8         print(end - start)
     9     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
    10 
    11 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
    12 def func():
    13     time.sleep(0.01)
    14     print('测试软件')
    15 
    16 def func1():
    17     time.sleep(2)
    18     print('测试')
    19 
    20 func()
    21 func1()

    当func()有返回值时

     1 import time
     2 
     3 def timmer(f):           #装饰器函数
     4     def inner():
     5         start = time.time()
     6         f()              #被装饰的函数
     7         end = time.time()
     8         print(end - start)
     9     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
    10 
    11 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
    12 def func():
    13     time.sleep(0.01)
    14     print('测试软件')
    15     return '测试软件'
    16 
    17 ret = func()
    18 print(ret)           #这样子,我们返回的结果并没有值,因为此时的func指向的
    19                      #是inner函数

    改进

     1 import time
     2 
     3 def timmer(f):           #装饰器函数
     4     def inner():
     5         start = time.time()
     6         ret = f()              #被装饰的函数
     7         end = time.time()
     8         print(end - start)
     9         return ret
    10     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
    11 
    12 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
    13 def func():
    14     time.sleep(0.01)
    15     print('测试软件')
    16     return '测试软件'
    17 
    18 ret = func()
    19 print(ret)           #现在这样子就解决了返回值的问题了

    当被调函数含有参数的时候

     1 import time
     2 
     3 def timmer(f):           #装饰器函数
     4     def inner(a):
     5         start = time.time()
     6         ret = f(a)              #被装饰的函数
     7         end = time.time()
     8         print(end - start)
     9         return ret
    10     return  inner        #切记这个地方传的是内部函数的名字,不是inner()
    11 
    12 @timmer                  #语法糖:紧贴着被装饰函数上一行放  @装饰器函数名
    13 def func(a):
    14     time.sleep(0.01)
    15     print('测试软件',a)
    16     return '测试软件'
    17 
    18 ret = func(1)
    19 print(ret)           #当有特殊需求时,可以将inner后参数设成*args或**kwargs

    装饰器的固定模式

     1 def wrapper(f):
     2     def inner(*args,**kwargs):
     3         '''
     4         这里加被装饰函数执行前的代码
     5         '''
     6         ret = f(*args,**kwargs)
     7         '''
     8         这里加被装饰函数执行后的代码
     9         '''
    10         return ret
    11     return inner
    12 
    13 #调用
    14 @wrapper
     
  • 相关阅读:
    数据库基本操作
    守护线程
    线程使用的场景
    创建多线程
    用正则表达式去截取网页里文字的方法。参数为读取的网页源代码
    文章生成器,Split方法截取字符串。从硬盘读取文件,和向硬盘存储文件参考代码
    winform 阶段学习总结
    Windowform 窗体关联数据库存储,读取图片,参考代码
    windows form窗体应用程序,建一个记事本参考代码,重点是打开,保存,另存为
    js实现相册翻页,滚动,切换,轮播功能
  • 原文地址:https://www.cnblogs.com/rcat/p/9321316.html
Copyright © 2011-2022 走看看