【问题标题】:Python decorators in classes with extra parameters具有额外参数的类中的 Python 装饰器
【发布时间】:2022-01-10 17:37:10
【问题描述】:

我读过这个

one answer 和这个 another answer

但我没有正确使用参数

class decoratortest:
    def dec(func):
        def wrapper(self,*args,**kwargs):
            func(*args,**kwargs)
            func(*args,**kwargs)
        return wrapper

    @dec
    def printer(self,a):
        print(a)
        
    def dectest(self):
        self.printer('hi')
x = decoratortest()
x.dectest()

我得到了通常的位置错误参数。什么是正确的语法,所以我可以打印 hi 两次?

对于未来,这行得通:

class decoratortest:
    def dec(func):
        def wrapper(self,*args,**kwargs):
            func(self,*args,**kwargs)
            func(self,*args,**kwargs)
        return wrapper

    @dec
    def printer(self,a):
        print(a)
        
    def dectest(self):
        self.printer('hi')
x = decoratortest()
x.dectest()

非常棘手,你不要在装饰器中输入 self,但你在底层包装器和 func 项中输入。

【问题讨论】:

    标签: python python-decorators


    【解决方案1】:

    您必须明确传递self,因为func 是对常规function 对象的引用,而不是self.printer 产生的method 对象(通过descriptor protocol):

    def dec(func):
        def wrapper(self, *args, **kwargs):
            func(self, *args, **kwargs)
            func(self, *args, **kwargs)
        return wrapper
    

    【讨论】:

      【解决方案2】:

      或者你可以把你的装饰器放在课堂之外

      def dec(func):
          def wrapper(*args, **kwargs):
              func(*args, **kwargs)
              func(*args, **kwargs)
      
          return wrapper
      
      
      class decoratortest:
          @dec
          def printer(self, a):
              print(a)
      
          def dectest(self):
              self.printer('hi')
      
      
      x = decoratortest()
      x.dectest()
      
      

      输出:

      hi
      hi
      

      【讨论】:

        【解决方案3】:
        class decoratortest:
            def dec(func):
                def wrapper(self,*args,**kwargs):
                    func(*args,**kwargs)
                    func(*args,**kwargs)
                return wrapper
        
            @dec
            def printer(self,a='hi'):
                print(a)
                
            def dectest(self):
                self.printer('hi')
                
        x = decoratortest()
        x.dectest()
        

        在未指定参数并且有效时为装饰器添加了默认值。

        【讨论】:

          猜你喜欢
          • 2021-04-11
          • 2012-04-27
          • 2023-03-31
          • 2011-11-21
          • 2014-07-21
          • 2014-03-24
          • 1970-01-01
          相关资源
          最近更新 更多