def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' % func.__name__
        return func(*args, **kw)
    return wrapper
b=0
@log
def countdown(n):
    b=0
    while n>0:
        n=n-1
        b+=n
    return b
print countdown(10)

C:\Python27\python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a27.py
call countdown():
45

一个装饰器就是一个函数,它接受一个函数作为参数并返回一个新的函数。装饰器其实就是一个闭包

# !/usr/bin/env python
# -*- coding: utf-8 -*-
def generate_greeting(prefix):
    def greeting(name):
        return prefix, name

    return greeting


# 返回一个全新的函数
a = generate_greeting('aaabbb')
print a
print type(a)

print a('ffff')

C:\Python27\python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a28.py
<function greeting at 0x0258FA30>
<type 'function'>
('aaabbb', 'ffff')