decorator


装饰器

1
2
3
4
嵌套函数():
装饰器():
新功能
return 装饰器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#Author:raydied
#装饰器的本质是函数,(装饰其它函数)
#调用之前,就将函数解释完毕的话,就是正确的
#函数为变量,函数之间可赋值
# def foo():
# print("in the foo")
# bar()
# return 0
#
# def bar():
# print("in the bar")
# return 0
#
# foo()

#高阶函数,将函数当做实参的函数
#1在不修改被修饰函数的源代码的情况下,为被修饰函数添加功能
#高阶函数--调用中


# def add_f(x,y,f):
# print("和为",f(x,y))#注意函数调用的时候只有函数的名字,没有小括号
#
# def add(a,b):
# return (a+b)
#
# add_f(1,-4,add)

# 高阶函数--返回值中调用函数,不改变原函数的调用
# import time
# def foo():
# time.sleep(1)
# print("in the foo")
#
# def test(func):
# start_time = time.time()
# func()
# stop_time = time.time()
# print("the function runs %ds"%(stop_time-start_time))
# return test(func)#这里应该返回装饰器函数,但是这样写的话,会成为递归下去,死循环
# #---》解决的办法就是加一层函数(嵌套),然后再返回装饰器函数
#
# foo = test(foo)
# foo()
#但是会出现foo函数两次调用,怎么避免呢!?
#嵌套函数,在一个函数体内定义一个新的函数def/区别函数的调用
# def decorator():
# print("in the decorator")
# def foo():
# print("in the foo")
# foo()
#
# decorator()
##解决上面的问题:装饰器=高阶函数+函数嵌套
# --》解决了不改变原函数的代码及其调用方式,仍增加函数的功能
import time

def timer(func):
def decorator():
start_time = time.time()
func()
stop_time = time.time()
print("the function runs %ds"%(stop_time-start_time))
#decorator()与下一行的效果等价,本行是函数的正常调用
return decorator#将函数的内存地址(即函数在电脑中的门牌号)获取,
# 赋值给装饰之前的函数,从而完成原函数的升级
@timer#test = timer(test)
def test():
time.sleep(2)
print("in the test")

test()#装饰之后,原函数已经变成了装饰后的函数,
#方法是 @timer后test函数已经将函数地址变成装饰后的test函数
文章目录
  1. 1. 装饰器
|