Python-Day04-装饰器(1)

来源:互联网 发布:数据录入员压力大吗 编辑:程序博客网 时间:2024/06/05 10:23

    今天要讲的是一个是我接触Python以来觉得听神奇的一个特性,就是“装饰器”。

装饰器顾名思义就是就是用于装饰的,那到底是用来装饰什么的呢?首先先让我们看一下简单的装饰器例子:

import timedef timmer(func):    def warpper(*args,**kwargs):        start_time=time.time();        func()        stop_time = time.time();        print("the func run time is %s"%(stop_time-start_time))    return warpper@timmerdef test1():    time.sleep(3)    print("in the test1")test1()

结果:

in the test1
the func run time is 3.000171422958374

在上面的例子中,timmer就是装饰器,test1()就是被装饰的对象,所以由此看出装饰器的作用就是装饰函数的!

可能你现在看上面的例子会稀里糊涂,为什么test()的结果会出现它没有的功能,现在暂时先放下疑惑,容我慢慢说来~


首先我们需要了解装饰器:

由上面可以的例子可以看出,其实装饰器的本质就是一个函数;

功能:就是为了其他函数添加附加功能(装饰函数)

而装饰器有两个使用原则:

1.不修改被装饰函数源代码

2.不修改被装饰函数的调用方式

所以说,装饰器实际上编写过程,是跟被装饰的函数是没有任何接触,只有在编译过程中,两者才有点关系!

继续进去正题,想要看懂装饰器,还需要知道几个概念:

1.在Python中可以认为:函数即变量

2.高阶函数:

高阶函数有两个条件,实现其一既是:

A:能把一个函数名当做实参传给另一个函数

B:返回值中包含函数名(不修改函数的调用方式)

3.Python函数可以嵌套函数

而其实装饰器的构成其实就是:     高阶函数+嵌套函数==>>装饰器


先说第一个变量:

1.函数即变量

先看例子:
def bar():    print("in the bar")def test1(func):    print(func)    func()test1(bar);
结果:
<function bar at 0x0000000001D13E18>
in the bar

在结果中我们发现,如果我们单纯的print()出bar不带()时,我们等到的<function bar at 0x0000000001D13E18>
0x0000000001D13E18 其实就是电脑的内存地址,其实我们就可以知道,其实函数跟变量一样,每当创建时,

就是会在电脑中创建一块地方给它,调用或者更改数值其实也不过是在内存里进行找它的内存地址并进行访问或者

更改里面的数值。所以说函数其实就是变量,其实只是他访问的条件会有区别而已,而当函数“变量”加上()就是运行

函数。

2.把函数当做实参

如果理解上面的,下面的例子看起来就会容易一点,假设我们需要实现一个功能:

实现计算一个函数的运行时间的“函数”。

例子:

import timedef bar():    time.sleep(3)    print("in the bar")def test1(func):    start_time=time.time()    func()    stop_time =time.time()    print("the func run time is %s"%(stop_time-start_time))test1(bar);
结果:

in the bar
the func run time is 3.000171422958374

这个例子我感觉能更直观的感受,首先我们需要导入time包,其中sleep()为延迟三秒,start_time和stop_time来用于

计算时间,期间运行时间,最后计算运行计算时间。

分析test1()函数,可以看到,上面参数其实就像我们平时参数那样导入,只是区别与平常,我们在里面进行了

func()运行,其实也就是在参数上加了(),我上点也提到。

而在结果中我们也看到,运行test1函数时,的确也运行了bar函数,并进行了时间的运算。所以可以说明,在

Python中“能把一个函数名当做实参传给另外一个函数”。

3.将函数进行返回

这个就比较容易了,其实也跟前面说的有点类似,看例子:

def bar():    time.sleep(3)    print("in the bar")def test1(func):    print(func)    return funcprint(test1(bar))
结果:

<function bar at 0x0000000001D03E18>
<function bar at 0x0000000001D03E18>

其实这个例子看过前面的估计也能理解,这里只是表达一下高阶函数的第二个特点,返回值中包含函数名,

而Python也是支持的。

4.嵌套函数

这个知识点使我们需要理解的最后一个知识点了,嵌套函数就跟名字一样,就是在函数中再创建一个新的函数

看例子:

def foo():    print("It is in foo")    def bar():        print("It is in bar")    bar()foo()
结果:

It is in foo
It is in bar

所以从例子和结果可以看出,python是允许在函数里面不断嵌套函数的,其实理解起来,也可以用函数即变量

来解释,其实一个函数里面的嵌套函数,通俗来讲就是主函数里面的形参,它的范围其实就跟不同变量一样,如果是

在主函数里创建的,有效范围就是在主函数里,切记不能放去主函数外使用,不然程序肯定就会报错。


最后:了解完这些知识点,我们就能进入我们最后的高潮。因为篇幅较长,所以截成两篇,另外的知识点,将在

   第二篇继续讲~


原创粉丝点击