Вы можете иметь класс, но вам нужно использовать протокол дескриптора
import types
class canRun(object):
def __init__(self, f):
self.f = f
self.o = object # <-- What the hell is this about?
def __call__(self, *args):
if self.longcondition():
self.f(*args)
def __get__(self, instance, owner):
return types.MethodType(self, instance)
Вам всегда нужно использовать дескриптор, когда вы хотите украсить методы класса экземпляром класса, используя метод __call__
. Причина этого заключается в том, что будет передан только один self
, который ссылается на экземпляр класса декорирования, а не на экземпляр декорированного метода.