decorator

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:woshinidaye
 4 
 5 #装饰器:本质属于函数,语法:def,修饰其他函数,添加附加功能。
 6 #类似于版本已经上线运行,现需要在版本中增加新功能,新特性且不能修改原版本文件。
 7 #且原函数的调用方式不能被改变。
 8 
 9 
10 import time
11 # def decorator(func):
12 #     def timer():
13 #         start_time = time.time()
14 #         func()
15 #         end_time = time.time()
16 #         print('this function run time is %s' %(end_time-start_time))
17 #     return timer
18 # @decorator          #test = decorator(test)
19 # def test():
20 #     time.sleep(2)
21 #     print('this is a test function')
22 # # test = decorator(test)        #test的内存地址就是decorator函数的返回值
23 # # test()
24 # test()
25 
26 #刚才这个test函数没有参数,在运行时func()时不会报错,但是如果另一个函数,test2有一个参数,这个时候就会出错;
27 
28 # def decorator(func):
29 #     def timer(args1):
30 #         start_time = time.time()
31 #         func(args1)
32 #         end_time = time.time()
33 #         print('this function run time is %s' %(end_time-start_time))
34 #     return timer
35 # @decorator          #test2 = decorator(test2)
36 # #把test2的内存地址传给decorator函数,decorator函数返回为timer的内存地址,那此时运行test2(’woshinidaye‘)就等于运行timer('woshinidaye'),
37 # #而最开始timer函数是没有变量的,所以会提示TypeError: timer() takes 0 positional arguments but 1 was given
38 # def test2(name):
39 #     time.sleep(2)
40 #     print('my name is %s' %name)
41 #
42 # # test2()                 #TypeError: test2() missing 1 required positional argument: 'name'
43 # test2('woshinidaye')    #TypeError: timer() takes 0 positional arguments but 1 was given
44 
45 #但是在timer函数固定了参数个数,岂不是只能对一个参数的函数装饰,没参数的或者有两个参数的函数都不能被装饰了。这就需要用到非固定参数了。
46 # def decorator(func):
47 #     def timer(*args,**kwargs):
48 #         start_time = time.time()
49 #         func(*args,**kwargs)
50 #         end_time = time.time()
51 #         print('this function run time is %s' %(end_time-start_time))
52 #     return timer
53 # @decorator          #test2 = decorator(test2)
54 # def test2(name):
55 #     time.sleep(2)
56 #     print('my name is %s' %name)
57 # @decorator
58 # def test():
59 #     time.sleep(2)
60 #     print('this is a test function')
61 # @decorator
62 # def test3(x,y,z=3,*args,**kwargs):
63 #     time.sleep(2)
64 #     print(x,y)
65 #     print(z)
66 #     print(args)
67 #     print(kwargs)
68 # test()
69 # test2('woshinidaye')
70 # test3(1,2,5,*[1,2,3],**{'name':'woshinidaye','age':13})
71 
72 def decorator(func):
73     def timer(*args,**kwargs):
74         start_time = time.time()
75         res = func(*args,**kwargs)
76         end_time = time.time()
77         print('this function run time is %s' %(end_time-start_time))
78         return res
79     return timer
80 @decorator
81 def test4():
82     time.sleep(2)
83     print('\033[032;1m in the func test4 \033[0m')
84     return '======>>>   test4'
85 
86 print(test4())              #装饰以前,test4()的返回结果是'======>>>   test4'
87 # #装饰以后,返回结果为none,这是因为运行test4()其实是运行timer(),而timer并没有返回任何信息
88 
89 
90 # def test1():
91 #     print('in the test1')
92 #     return test2()
93 #     #return test2     两条命令是不一样的
94 #
95 # def test2():
96 #     print('in the test2')
97 # test1()
98 # print(test1())

 

上一篇:python2.7安装jupyter报错


下一篇:Springboot 返回数据提示语 国际化 (AOP实现),springboot实战项目教程