码迷,mamicode.com
首页 > 编程语言 > 详细

Python之----装饰器

时间:2017-12-28 17:17:27      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:实参   star   timer   情况下   参数   time()   知识点   不能   war   

作用:

  在不改变函数源代码的前提下,给函数增加新的功能。

装饰器
1,本质上是一个函数
2,功能---装饰其他函数(为其他函数添加其他功能)
3,不能修改被装饰函数的源代码
4,不能修改被装饰函数的调用方式

实现装饰器的知识储备:
1,函数即“变量”
2,高阶函数
a,把一个函数当作实参,传给另外一个函数(在不修改被装饰函数源代码情况下,为其增加功能)
b,返回值包含函数名(不修改函数的调用方式)
例子:
def bar():
print("this is bar")
def test(func):
print("this is test")----看作是添加的新功能
return func--------------bar其实就是一个内存地址,加上()的时候就能调用。当把bar当作参数传给test的时候,返回的就是bar内存地址。
bar = test(bar)-------------这个操作就相当于:即给了bar一个内存地址使其加上()能调用,且能将test函数里的print内容展示出来
bar()
运行结果:
this is test
this is bar
3,嵌套函数
在函数内部def一个函数。
def test():
print("hahaha")
def bar():
print("bababa")
bar()
test()
运行结果:
hahaha
bababa

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

import time
def timer(func):
def dec(*args,**kwarge):#加上这两个,是预防被装饰的函数带有参数。
start_time = time.time()
func(*args,**kwarge)#加上这两个,是预防被装饰的函数带有参数。
end_time = time.time()
print("pro run time is %s"%(end_time-start_time))
return dec
@timer #等价于 test1 = timer(test1)。timer(test1)这个函数执行结果是返回了 dec的内存地址。-----高阶函数知识点:返回值包含函数名
#其实就是相当于把dec对应的那个内存空间再多加了一个名字“test1”
#而原先的test1的内存空间当作一个参数,传给了timer,并给了个名字func。-----高阶函数知识点:把函数当作实参,传给另外一个函数
def test1():
time.sleep(3)
print("this is test1")
def test2(name):
print("welecome %s"%name)
test1()#所以当执行到这一段的时候,其实是执行的dec(),然后接下来步骤就显而易见了。
test2()

装饰器自己也可以带参数

 

Python之----装饰器

标签:实参   star   timer   情况下   参数   time()   知识点   不能   war   

原文地址:https://www.cnblogs.com/h2o2mno2h2/p/8136206.html

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