参考博文:

Python装饰器与面向切面编程

Python装饰器学习(九步入门)


测试程序:

1. 原函数功能为输出名字。现需求:不改变原函数内容,为其添加额外功能--输出名字前先输出‘Hi there!’。此处使用了基本的装饰器用法。

def sayName():
        print 'My name is: Stephen!'

def sayHi(func):
        def wrapper():
                print 'Hi there!'
                func()
        return wrapper

sayName = sayHi(sayName)
sayName()

Result:

stephen@Ubuntu01:~/project/stu905/day4$ python decorator_test.py 
Hi there!
My name is: Stephen!



2. 与例1类似,只不过使用了语法糖。

def sayHi(func):
        def wrapper():
                print 'Hi there!'
                func()
                print 'Goodbye!'
        return wrapper

@sayHi
def myName():
        print 'My name is: Stephen'

myName()

Result:

stephen@Ubuntu01:~/project/stu905/day4$ python sayhi.py 
Hi there!
My name is: Stephen
Goodbye!


3. 尝试了下原函数带参数及返回值的情况。原函数为显示具体年份是否为闰年,要求添加额外功能:输出结果前先读取年份并且输出它。

def printYear(func):
        def wrapper(y):
                print 'The year you have enter: %d' % y
                ret = func(y)
                return ret
        return wrapper

@printYear
def isLeapYear(year):
        Leap = False
        if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
                Leap = True
        return Leap

print '2014 is leap year? %s' % isLeapYear(2014)
print '2012 is leap year? %s' % isLeapYear(2012)

Result:

stephen@Ubuntu01:~/project/stu905/day4$ python leap_year.py 
The year you have enter: 2014
2014 is leap year? False
The year you have enter: 2012
2012 is leap year? True