2010-02-22 138 views
3

獲取類在此代碼:在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返回真。我如何才能使online_only能夠閱讀self.running?

回答

3

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. 你不能在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