def __init__(self, f): """ If there are no decorator arguments, the function to be decorated is passed to the constructor. """ PrintUtils.green("Inside __init__()") self.f = f
def __init__(self, arg1, arg2, arg3): """ If there are decorator arguments, the function to be decorated is not passed to the constructor! """ PrintUtils.green("Inside __init__()") self.arg1 = arg1 self.arg2 = arg2 self.arg3 = arg3
def __call__(self, *args): """ The __call__ method is not called until the decorated function is called. """ print PrintUtils.green("Inside __call__()") self.f(*args) PrintUtils.green("After self.f(*args)") print
def __call__(self, f): """ If there are decorator arguments, __call__() is only called once, as part of the decoration process! You can only give it a single argument, which is the function object. """ PrintUtils.green("Inside __call__()") @wraps(f) def wrapped_f(*args): PrintUtils.green("Inside wrapped_f()") print 'Decorator arguments: ', self.arg1, self.arg2, self.arg3 f(*args) PrintUtils.green("After f(*args)") return wrapped_f
def wrapped_f(*args): PrintUtils.green("Inside wrapped_f()") print 'Decorator arguments: ', self.arg1, self.arg2, self.arg3 f(*args) PrintUtils.green("After f(*args)")