码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器之高阶函数

时间:2019-01-23 22:34:58      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:不能   高阶函数   lan   现在   --   port   添加   col   UNC   

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

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:综上上述只能称之为高阶函数:并且使用了高阶函数的第一个条件

装饰器之高阶函数

标签:不能   高阶函数   lan   现在   --   port   添加   col   UNC   

原文地址:https://www.cnblogs.com/jb9527/p/10311860.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!