在Python装饰器中获取类

时间:2010-02-22 06:07:11

标签: python

在此代码中:

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?

2 个答案:

答案 0 :(得分:4)

self作为第一个参数传递给包装函数,所以只需要在f中专门处理第一个参数:

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

答案 1 :(得分:1)

  1. def online_only(func, self)中不能有两个参数?它会引发TypeError,因此将其更改为def online_only(func)
  2. 包装函数的第一个参数是self,你可以使用它 e.g。

  3. 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