【问题标题】:Get class in Python decorator在 Python 装饰器中获取类
【发布时间】:2011-01-19 12:42:20
【问题描述】:

在这段代码中:

def online_only(func, self):
    def f(*args, **kwargs):
        if self.running:
            return func(*args, **kwargs)
        else:
            return False
    return f
class VM(object):
   @property
   def running(self):
       return True
   @property
   @online_only
   def diskinfo(self):
       return True

我希望 diskinfo 仅在 VM.running 返回 True 时运行。如何让 online_only 能够读取 self.running?

【问题讨论】:

    标签: python


    【解决方案1】:

    self作为第一个参数传递给包装函数,所以只在f中特殊对待第一个参数:

    def online_only(func):
        def f(self, *args, **kwargs):
            if self.running:
                return func(self, *args, **kwargs)
            else:
                return False
        return f
    

    【讨论】:

      【解决方案2】:
      1. def online_only(func, self) 中不能有两个参数?它将引发 TypeError,因此将其更改为 def online_only(func)
      2. 包装函数的第一个参数是 self,你可以使用它 例如

      def online_only(func):
          def f(self):
              if self.running:
                  return func(self)
              else:
                  return False
          return f
      
      class VM(object):
          @property
          def running(self):
              return True
      
          @property
          @online_only
          def diskinfo(self):
              return True
      
      print VM().diskinfo
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-02
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 2011-04-28
        • 2011-12-02
        • 1970-01-01
        相关资源
        最近更新 更多