zoukankan      html  css  js  c++  java
  • 十三:装饰器函数

    一:装饰器的作用就是在原来函数的基础上增加了一些扩展的功能,因为我们开始写的函数已经投入应用了,所以不能对原函数进行修改,也不能修改对它的调用方式,即“开放封闭原则”,封闭:就是说不能对已经使用的函数进行任何修改;开放:就是说虽然不能对原函数进行修改,但是我们可以进行扩展,以增加新的功能。当然我们也可以在执行某些函数之前需要执行其它固定函数,也可以作为装饰器函数的应用,比如登陆操作,无论进入那个功能函数,都需要提前进行登陆,所以可以把登陆功能作为其它功能函数的装饰器来用。

    example 1:需求:对已经投入使用的函数 foo() 增加了一个函数运行时间的功能,并且不能改变其原来的调用方式。

     1 # 需求:在不改变调用方式的情况下,给要求的函数加上计算执行时间的功能
     2 
     3 import time
     4 
     5 def show_time(f):
     6     def inner():
     7         start = time.time()
     8         f()
     9         end = time.time()
    10         print('spend %s' % (end - start) )
    11     return inner
    12 
    13 @show_time    # foo = show_time(foo)
    14 def foo():
    15     print('foo...')
    16     time.sleep(2)
    17 
    18 foo()  # 仍以原来的方式进行调用
    Decorator

    example 2:对功能函数和装饰器函数加入参数,对装饰器加参数,我们需要再嵌套一层循环,这样就可以引入一个参数。

     1 # 需求:在不改变调用方式的情况下,给要求的函数加上计算执行时间的功能
     2 
     3 import time
     4 
     5 def logger(flag = 'Flase'):  # 装饰器函数传入参数
     6     def show_time(f):    # 不能直接在这个函数中加入参数,因为装饰器格式是定好的
     7         def inner(x,y):    # 给功能函数加参数要传入形参
     8             start = time.time()
     9             f(x,y)         # 对 f 的访问为闭包,给功能函数加参数要传入形参
    10             end = time.time()
    11             print('spend %s' % (end - start) )
    12             if flag == 'true':
    13                 print('日志记录')
    14         return inner
    15     return show_time      #需要多加一个返回,返回值为嵌套的最外层函数
    16 
    17 @logger('true')    #  == @show_time     add = show_time(add)
    18 def add(x,y):
    19     time.sleep(2)
    20     print(x + y)
    21 
    22 add(1,2)
    装饰器加参数

    example 3:如果装饰器函数不需要参数的话,那么只需要给功能函数加如参数就可以了。

     1 import time
     2 
     3 def show_time(f):
     4     def inner(x,y):   # 给功能函数加参数要传入形参
     5         start = time.time()
     6         f(x,y)         # 对 f 的访问为闭包,给功能函数加参数要传入形参
     7         time.sleep(1)
     8         end = time.time()
     9         print('spend %s' % (end - start) )
    10     return inner
    11 
    12 @show_time   # foo = show_time(foo)
    13 def foo(x,y):
    14     print('result:',x + y)
    15 
    16 foo(1,2)
    只给功能函数加参数
    所有博文均为原著,如若转载,请注明出处!
  • 相关阅读:
    1058 合唱队形
    1092 不高兴的津津
    2567 谷仓维修
    JavaWeb网上图书商城完整项目--BaseServlet
    JavaWeb网上图书商城完整项目--发送邮件
    JavaWeb网上图书商城完整项目-数据库操作工具类2-MapHandle的高级用法
    JavaWeb网上图书商城完整项目-数据库操作工具类
    JavaWeb网上图书商城完整项目-CommonUtils(1生成uuid,2Map转换成JavaBean)
    Downloadmanager实现app实现的升级下载使用
    黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
  • 原文地址:https://www.cnblogs.com/zpcoding/p/9454499.html
Copyright © 2011-2022 走看看