Получить класс в Python оформитель - PullRequest
4 голосов
/ 22 февраля 2010

В этом коде:

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 ]

4 голосов
/ 22 февраля 2010

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 голос
/ 22 февраля 2010
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...