【装饰器原理】
装饰器本身是一个函数,她以其它函数作为传入自身的参数,经过处理后再返回一个新的函数。
【装饰器目的】
动态地修改一个函数的功能,而不必修改函数代码。
再引用一段网上的解释:
“装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。”
【装饰器实现】
在学习装饰器之前,我们必须知道一个概念:在 Python中,任何函数都可以通过 可变参数 + 关键字参数 的形式进行调用。
格式如下:
function(*args, **keywords)
装饰器本身是一个函数,她以其它函数作为传入自身的参数,经过处理后再返回一个新的函数。
【装饰器目的】
动态地修改一个函数的功能,而不必修改函数代码。
再引用一段网上的解释:
“装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。”
【装饰器实现】
在学习装饰器之前,我们必须知道一个概念:在 Python中,任何函数都可以通过 可变参数 + 关键字参数 的形式进行调用。
格式如下:
function(*args, **keywords)
装饰器中就是定义一个上面这种形式的子函数,用于增强作为参数传入的函数的功能。
def plusPrint(fn): # 定义装饰器
def wrapper(*args, **keywords): # wrapper()函数将 fn()函数与自身整合为一体
print 'Plus this print on function %s().' %(fn.__name__) # 为 fn()函数增加的功能
return fn(*args, **keywords) # 插入已有的函数
return wrapper # 返回整合后的函数
@plusPrint # 使用装饰器
def testFn():
print 'testFn running!'
testFn() # 调用
# 将语句 @plusPrint 置于函数定义之上,相当于执行了语句 testFn = plusPrint(testFn)
# 以后调用 testFn() 函数的时候实际上是调用的经过 plusPrint() 处理之后的
上面代码的输出结果如下图:
# 上面的简单装饰器示例代码中,是装饰器的子函数对某个传入函数进行功能添加,之后装饰器返回这个函数
# 因此要给装饰器传入参数,就需要在装饰器的外面再用一个装饰器封装,再返回内层的装饰器
def plusElement(param):
def plusPrint(fn):
def wrapper(*args, **keywords):
print 'Plus PRINT on function %s(), and plus ELEMENT %s' %(fn.__name__, param)
return fn(*args, **keywords) # 插入已有的函数
return wrapper # 为装饰器返回一个函数
return plusPrint # 返回一个装饰器
@plusElement('Mathematic') # 使用带参数的装饰器
def testFn():
print 'testFn running!'
testFn()
# 将语句 @plusElement('Mathematic') 置于子函数定义之上,相当于执行了语句 testFn = plusElement('Mathematic')(testFn)
# 以后调用 testFn() 函数实际上是调用的经过处理后的 testFn()
上面的代码输出结果如下图: