Python 中的装饰器

Posted

tags:

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

说到装饰器是我们每个学Python人中的心痛。

装饰器作用:是用来装饰其他函数的,为其他函数添加新功能。

原则:1.不能改变被修饰函数的源代码。

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

学装饰器前还需要了解的东西:

返回值(return):

return 语句是可选的,它可以定义在函数体的任意位置表示函数调用到此结束。如果没有return语句输出的是none,如果有return语句但是return后没有跟东西,也是返回的是none。

注意:(1)要想看到return后边的值,需要打印出来print(func())

            (2)不需要看到return后边的值,直接调用func()。

          (3)返回值中跟函数其实是跟的函数名字。

func(-10)是函数调用,得到的是函数值:包括print后的东西,和return后的东西

func 是函数对象,函数名,门牌号,得到的是内存地址。

 

高阶函数:1.一个函数接收另一个函数名做参数。

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

补充:

嵌套函数:在一个函数里定义新的一个函数。

函数即是变量:变量就是定义后可以改变,可以重新赋值的量。

装饰器=高阶函数+嵌套函数

例子要求:1.写一个装饰器,计算两个程序运行耗时。

                  2.不改变源代码和调用方式。

例子:

技术分享
1 # Author :ZHANG
2 #-*-coding:utf-8-*-
3 import time
4 def text1():
5     time.sleep(3)
6     print("in the text1")
7 def text2():
8     time.sleep(2)
9     print("in the text2")
View Code

方法:

技术分享
 1 # Author :ZHANG
 2 #-*-coding:utf-8-*-
 3 import time
 4 def solu(func):
 5     def wreppe():
 6         star_time=time.time()
 7         func()
 8         stop_time=time.time()
 9         print("耗时为%s秒."%(stop_time-star_time))
10     return wreppe
11 @solu      #这里其实为:text1=solu(text1)
12 def text1():
13     time.sleep(3)
14     print("in the text1")
15 @solu    #同text1
16 def text2():
17     time.sleep(2)
18     print("in the text2")
19 text1()    #这里并不是真的text1(),其实是一个替代,solu(text1)()
20 text2()   #同text1
View Code

结果:

技术分享
1 in the text1
2 耗时为3.000171661376953秒.
3 in the text2
4 耗时为2.0001144409179688秒.
View Code

继续增加要求:text2加上多个参数,包括关键参数

方法:

技术分享
 1 # Author :ZHANG
 2 #-*-coding:utf-8-*-
 3 import time
 4 def solu(func):
 5     def wreppe(*args,**kwargs):
 6         star_time=time.time()
 7         func(*args,**kwargs)
 8         stop_time=time.time()
 9         print("耗时为%s秒."%(stop_time-star_time))
10     return wreppe
11 @solu     #这里其实为:text1=solu(text1)=wreppe
12 def text1():
13     time.sleep(3)
14     print("in the text1")
15 @solu  #同text1
16 def text2(*args,**kwargs):
17     time.sleep(2)
18     print("text2:",args,kwargs)
19 text1()         #这里并不是真的text1(),其实是一个替代,solu(text1)()
20 text2(2,"we",a=1)  #同text1
View Code

结果:

技术分享
1 in the text1
2 耗时为3.000171661376953秒.
3 text2: (2, we) {a: 1}
4 耗时为2.0001144409179688秒.
View Code

 

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

类中的装饰器在Pycharm中抛出警告

Python中的装饰器之写一个装饰器

python装饰器了解

06-python中的装饰器

类中的Python装饰器

python中的装饰器