zoukankan      html  css  js  c++  java
  • Python中带参数的装饰器

    装饰器本身是用来是为一个函数是实现新的功能,并且不改变原函数的代码以及调用方式。

    遇到这样一种问题:

    众多函数调用了你写的装饰器,但客户有需求说,我想实现我可以随之控制装饰器是否生效。

    那你就不可能在得到命令的时候去原函数头部去做删除和添加装饰器调用的命令。这是就可以用到带参数的装饰器,定义一个开关,调用装饰器的时候,把这个装饰器的开关参数给传递进去,这样当开关打开的时候装饰器生效,关闭的时候则只执行原函数的代码。

    举例:开关参数为True的时候执行过程:

     1 F = True          #step 1 装饰器的开关变量
     2 def outer(flag):  #step 2
     3     def wrapper(func): #step 4
     4         def inner(*args,**kwargs): #stpe 6
     5             if flag:               #step 9
     6                 print('before')   #step 10
     7                 ret = func(*args,**kwargs)  #step 11  执行原函数
     8                 print('after')             #step13
     9             else:
    10                 ret = func(*args,**kwargs)
    11                 print('123')
    12             return ret                     #step 14
    13         return inner    #step 7
    14     return wrapper     #step 5
    15 
    16 @outer(F)   #先执行step 3 :outer(True)这个函数,然后step 6:@wrapper   #此处把开关参数传递给装饰器函数
    17 def hahaha():
    18     pass    #step 12
    19 hahaha()    # step 8    相当于inner()

    开关参数为False的时候执行过程:

     1   F = False          #stpe1 装饰器的开关变量
     2   def outer(flag):  #step 2
     3       def wrapper(func): #step 4
     4           def inner(*args,**kwargs): #stpe 6
     5               if flag:               #step 9
     6                   print('before')   
     7                   ret = func(*args,**kwargs)    
     8                   print('after')             
     9               else:
    10                  ret = func(*args,**kwargs)    #step 10  执行原函数
    11                  print('123')                 #step 12
    12              return ret                     #step 13
    13          return inner    #step 7
    14      return wrapper     #step 5
  • 相关阅读:
    J2EE之ANT
    lsof在运维中的应用
    Qt编译OpenGL程序遇到的问题
    算法导论第八章__实现计数排序
    MYSQL 更新时间自己主动同步与创建时间默认值共存问题
    微软系统工具套件SysinternalsSuite各个工具功能说明
    【转】如何查看linux版本 如何查看LINUX是多少位
    【转】linux下解压.bz2压缩文件
    【转】db/dbm
    【转】BLE_CC2540_初学者入门指导
  • 原文地址:https://www.cnblogs.com/eric_yi/p/7255455.html
Copyright © 2011-2022 走看看