本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考,具体如下:
1、装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能
2、装饰器的原则:
(1) 装饰器不能修改被装饰的函数的源代码
(2) 装饰器不能修改被装饰的函数的调用方式
3、实现装饰器的知识储备
(1) Python中函数即‘变量'
a、变量在Python中的存储
x='Tomwenxing'y=x
[说明]:
当Python解释器遇到语句x='Tomwenxing'时,它主要完成了两样工作:
1.在内存中开辟了一片空间用来存储字符串‘Tomwenxing'
2.在内存从创建了一个名为x的变量,并用它指向字符串‘Tomwenxing'所占据的内存空间(可以理解为房间和房间号的关系)
而语句y=x意为将变量x对字符串的引用赋值给变量y,即在内存中创建一个变量y,并使其指向变量x所指向的内存空间
b、函数在Python中的存储
def test(): pass
[说明]:
在Python中,函数的存储和变量相似,以上面的函数为例,Python解释其主要做两件事:
1.在内存中开辟一个内存空间,用来存储函数代码的字符串(本例中代码只有一句:pass)
2.在内存中创建一个变量test,用来指向存储函数代码字符串的内存空间(相当于test=‘函数体')
因此说在Python中函数即变量
(2) 高阶函数(下面两个条件满足任何一个即为高阶函数)
a、把一个函数名当做实参传递给另外一个函数
[对装饰器的影响]:达到“在不修改被装饰函数源代码的情况下为其添加功能”的效果
import timedef bar(): time.sleep(2) print('in the bar')def test(func): start_time=time.time() func() stop_time=time.time() print('函数的运行时间为:',stop_time-start_time)test(bar)
运行结果:
in the bar
函数的运行时间为: 2.0021145343780518
b、返回值中包含函数名
[对装饰器的影响]:达到“不改变函数的调用方式“的效果
import timedef bar(): time.sleep(3) print('in the bar')def test2(func): print('新添加的功能') return funcbar=test2(bar)bar()
运行结果:
新添加的功能
in the bar
(3) 嵌套函数:在一个函数体内用def去声明一个新的函数(不是调用)
def foo(): print('in the foo') def bar(): #声明一个新的函数,而不是调用函数 print('in the bar') bar()foo()
新闻热点
疑难解答