Python 设计模式 decorator


Another common way to alter the way a function behaves is to “decorate” it
with another function. This is also often called “wrapping” a function, as
decorators are designed to execute additional code before or after the
original function gets called. The key principle behind decorators is that
they accept callables and return new callables. The function returned by the
decorator is the one that will be executed when the decorated function is
called later. Care must be taken to make sure that the original function isn’t
lost in the process, as there wouldn’t be any way to get it back without
reloading the module. Decorators can be applied in a number of ways, either to
a function you’re defining directly or to a function that was defined
elsewhere. As of Python 2.4, decorators on newly defined functions can use a
special syntax. In previous versions of Python, a slightly different syntax is
necessary, but the same code can be used in both cases; the only difference is
the syntax used to apply the decorator to the intended function. 以上是原文,不作翻译了。
from 《Pro Django》CHAPTER 2


def decorate(func):
    print 'Decorating %s...' % func.__name__,
    def wrapped(*args, **kargs):
          print "Called wrapped function with args:", args
          return func(*args, **kargs)
    print 'done!'
    return wrapped

def test(a, b):
      return a + b

if __name__ == 'main':
    test(13, 72)

Called wrapped function with args: (13, 72)