2010-02-22 4 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 возвращается True. Как я могу получить онлайн-доступ, чтобы читать 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 
Смежные вопросы