Получить класс в 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 ответа
Решение
self
передается в качестве первого параметра функции обтекания, поэтому просто обработайте первый параметр специально в f
:
def online_only(func):
def f(self, *args, **kwargs):
if self.running:
return func(self, *args, **kwargs)
else:
return False
return f
- Вы не можете иметь два аргумента в
def online_only(func, self)
? это вызовет TypeError, поэтому измените его наdef online_only(func)
- Первым аргументом обернутой функции будет 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