装饰器之高阶函数

Posted jb9527

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器之高阶函数相关的知识,希望对你有一定的参考价值。

高阶函数概念引入:满足下面两个条件之一便可以称为高阶函数

1:把一个函数的函数名当作实参传给另外一个函数。

2:返回值中包含函数名。

下面是一段简单的高阶函数的代码使用条件1:

# Author:Ju BO
‘‘‘
def bar():
    print("in the bar")
def test1(func):
    print(func) #----相当于打印bar这个函数在内存中的门牌号即内存地址
    func()#----相当于bar(),调用bar这个函数
test1(bar)#----将bar函数名当作实参传给test1函数,test1函数用形参func来接收它。
‘‘‘

下面是一段在第一段代码的基础上新增了一些功能的高阶函数,从中也慢慢显示出了装饰器的影子。

#----改进------------------
#这段代码的功能为统计bar这个函数的运行时间
import time #---导入库
def bar():
    time.sleep(3) #---等3秒
    print("in the bar")
def test1(func):
    start_time = time.time() #----截取开始时间
    func() #---相当于bar(),运行bar这个函数
    stop_time = time.time() #-----截取结束时间
    print("the func run time is %s"%(stop_time - start_time))#---结束时间-开始时间 = bar的运行时间
test1(bar) #--将bar当作实参传递给test1

3:观察第二段代码发现貌似已经实现了装饰函数的功能,之前没有test1这个函数时,bar这个函数单纯的功能为打印“in the bar”,而现在test1这个函数附加了一个功能:计算bar这个函数的运行时间。那么根据装饰器的定义:本质是函数,目的是为其他函数添加附加功能,test1这个函数可以称之为装饰器吗?其实不然,暂时还不能称它为装饰器。因为要称之为装饰器,必须还要遵循2个原则:

(1):不能修改被装饰函数的源代码。

(2):不能修改被装饰的函数的调用方式。

4:为什么不能称test1为装饰器呢?原因很简单,依据3中提出的两个原则:首先明确bar是要被装饰的函数,test1该函数并没有修改它的源代码,满足第一条。但是显然第二条原则不满足,之前我们调用bar这个函数时是这样调用的:bar(),但是现在变成这样了:test1(bar),然后再在test1函数中调用bar,改变了bar这个函数的调用方式

5:综上上述只能称之为高阶函数:并且使用了高阶函数的第一个条件

以上是关于装饰器之高阶函数的主要内容,如果未能解决你的问题,请参考以下文章

Python装饰器之 property()

Python装饰器之 property()

9.4装饰器之装饰函数的参数

9.3装饰器之被装饰函数的参数

python装饰器之函数作用域

装饰器之嵌套函数