python 带可变参数的装饰器怎么用

 我来答
育知同创教育
2017-11-12 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部

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

遇到这样一种问题:

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

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

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

F = True          #step 1 装饰器的开关变量
def outer(flag):  #step 2
    def wrapper(func): #step 4
        def inner(*args,**kwargs): #stpe 6
            if flag:               #step 9
                print('before')   #step 10
                ret = func(*args,**kwargs)  #step 11  执行原函数
                print('after')             #step13
            else:
                ret = func(*args,**kwargs)
                print('123')
            return ret                     #step 14
        return inner    #step 7
    return wrapper     #step 5

@outer(F)   #先执行step 3 :outer(True)这个函数,然后step 6:@wrapper   #此处把开关参数传递给装饰器函数
def hahaha():
    pass    #step 12
hahaha()    # step 8    相当于inner()

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

F = False          #stpe1 装饰器的开关变量
  def outer(flag):  #step 2
      def wrapper(func): #step 4
          def inner(*args,**kwargs): #stpe 6
              if flag:               #step 9
                  print('before')   
                  ret = func(*args,**kwargs)    
                  print('after')             
              else:
                 ret = func(*args,**kwargs)    #step 10  执行原函数
                 print('123')                 #step 12
             return ret                     #step 13
         return inner    #step 7
     return wrapper     #step 5
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式