专栏首页python3day20-python之装饰器

day20-python之装饰器

1.装饰器

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 def cal(l):
 5     start_time=time.time()
 6     res=0
 7     for i in l:
 8         time.sleep(0.1)
 9         res+=i
10     stop_time = time.time()
11     print('函数的运行时间是%s' %(stop_time-start_time))
12     return res
13  
14 
15 
16 print(cal(range(100)))
17 
18 
19 def index():
20     pass
21 
22 def home():
23     pass

2.装饰器预演

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 def timmer(func):
 5     def wrapper(*args,**kwargs):
 6         start_time=time.time()
 7         res=func(*args,**kwargs)
 8         stop_time = time.time()
 9         print('函数运行时间是%s' %(stop_time-start_time))
10         return res
11     return wrapper
12  
13 def timmer1(func):
14     def wrapper(*args,**kwargs):
15         start_time = time.time()
16         res = func(*args,**kwargs)
17         stop_time = time.time()
18         print('函数运行时间是%s' %(stop_time-start_time))
19         return res
20     return wrapper()
21 
22 
23 @timmer
24 def cal(l):
25     res=0
26     for i in l:
27         time.sleep(0.1)
28         res+=i
29     return res
30 
31 res=cal(range(20))
32 print(res)
33 
34 
35 def index():
36     pass
37 
38 def home():
39     pass

3.高阶函数

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 '''
 4 高阶函数定义:
 5 1.函数接收的参数是一个函数名
 6 2.函数的返回值是一个函数名
 7 3.满足上述条件任意一个,都可称之为高阶函数
 8 '''
 9 # import time
10 # def foo():
11 #     time.sleep(3)
12 #     print('你好啊林师傅')
13 
14 # def test(func):
15 #     # print(func)
16 #     start_time=time.time()
17 #     func()
18 #     stop_time = time.time()
19 #     print('函数运行时间是  %s' % (stop_time-start_time))
20 # foo()
21 # test(foo)
22 
23 # def foo():
24 #     print('from the foo')
25 # def test(func):
26 #     return func
27 # res=test(foo)
28 # # print(res)
29 # res()
30 
31 
32 import time
33 def foo():
34     time.sleep(3)
35     print('来自foo')
36 
37 #不修改foo源代码
38 #不修改foo调用方式
39 
40 #多运行了一次,不合格
41 # def timer(func):
42 #     start_time=time.time()
43 #     func()
44 #     stop_time = time.time()
45 #     print('函数运行时间是  %s' % (stop_time-start_time))
46 #     return func
47 # foo=timer(foo)
48 # foo()
49 
50 
51 #没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能
52 # def timer(func):
53 #     start_time=time.time()
54 #     return func
55 #     stop_time = time.time()
56 #     print('函数运行时间是  %s' % (stop_time-start_time))
57 #
58 # foo=timer(foo)
59 # foo()
60  

4.函数嵌套

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # def bar():
 4 #     print('from bar')
 5 #
 6 # def foo():
 7 #     print('from foo')
 8 #     def test():
 9 #         pass
10 
11 def father(auth_type):
12     # print('from father %s' %name)
13     def son():
14         # name='linhaifeng_1'
15         # print('我的爸爸是%s' %name)
16         def grandson():
17             print('我的爷爷是%s' %auth_type)
18         grandson()
19     # print(locals())
20     son()
21 # father('linhaifeng')
22 father('filedb')

5.加上返回值

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 def timmer(func): #func=test
 5     def wrapper():
 6         start_time=time.time()
 7         res=func() #就是在运行test()
 8         stop_time = time.time()
 9         print('运行时间是%s' %(stop_time-start_time))
10         return res
11     return wrapper
12 
13 @timmer #test=timmer(test)
14 def test():
15     time.sleep(3)
16     print('test函数运行完毕')
17     return '这是test的返回值'
18 
19 # res=test()  #就是在运行wrapper
20 # print(res)

 6.加上参数

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 def timmer(func): #func=test1
 5     def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}
 6         start_time=time.time()
 7         res=func(*args,**kwargs) #就是在运行test()         func(*('linhaifeng'),**{'age':18})
 8         stop_time = time.time()
 9         print('运行时间是%s' %(stop_time-start_time))
10         return res
11     return wrapper
12 
13 
14 
15 # @timmer #test=timmer(test)
16 
17 def test(name,age):
18     time.sleep(3)
19     print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
20     return '这是test的返回值'
21 
22 @timmer
23 def test1(name,age,gender):
24     time.sleep(1)
25     print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
26     return '这是test的返回值'
27 
28 res=test('linhaifeng',age=18)  #就是在运行wrapper
29 print(res)
30 # test1('alex',18,'male')
31 
32 # test1('alex',18,'male')
33 
34 
35 
36 
37 
38 # def test2(name,age,gender): #test2(*('alex',18,'male','x','y'),**{})
39 #     #name,age,gender=('alex',18,'male','x','y')
40 #     print(name)
41 #     print(age)
42 #     print(gender)
43 #
44 # def test1(*args,**kwargs):
45 #     test2(*args,**kwargs)  #args=('alex',18,'male','x','y') kwargs={}
46 #
47 # # test2('alex',18,gender='male')
48 #
49 # test1('alex',18,'male')

7.装饰器实现

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 def timmer(func): #func=test
 5     def wrapper():
 6         # print(func)
 7         start_time=time.time()
 8         func() #就是在运行test()
 9         stop_time = time.time()
10         print('运行时间是%s' %(stop_time-start_time))
11     return wrapper
12 
13 @timmer #test=timmer(test)
14 def test():
15     time.sleep(3)
16     print('test函数运行完毕')
17 test()
18 
19 # res=timmer(test)  #返回的是wrapper的地址
20 # res()  #执行的是wrapper()
21 
22 # test=timmer(test)  #返回的是wrapper的地址
23 # test()  #执行的是wrapper()
24 
25 #  @timmer  就相当于 test=timmer(test)

8.验证功能装饰器

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 user_list=[
 4     {'name':'alex','passwd':'123'},
 5     {'name':'linhaifeng','passwd':'123'},
 6     {'name':'wupeiqi','passwd':'123'},
 7     {'name':'yuanhao','passwd':'123'},
 8 ]
 9 current_dic={'username':None,'login':False}
10 
11 
12 def auth_func(func):
13     def wrapper(*args,**kwargs):
14         if current_dic['username'] and current_dic['login']:
15             res = func(*args, **kwargs)
16             return res
17         username=input('用户名:').strip()
18         passwd=input('密码:').strip()
19         for user_dic in user_list:
20             if username == user_dic['name'] and passwd == user_dic['passwd']:
21                 current_dic['username']=username
22                 current_dic['login']=True
23                 res = func(*args, **kwargs)
24                 return res
25         else:
26             print('用户名或者密码错误')
27 
28     return wrapper
29 
30 @auth_func
31 def index():
32     print('欢迎来到京东主页')
33 
34 @auth_func
35 def home(name):
36     print('欢迎回家%s' %name)
37 
38 @auth_func
39 def shopping_car(name):
40     print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
41 
42 print('before-->',current_dic)
43 index()
44 print('after--->',current_dic)
45 home('产品经理')
46 shopping_car('产品经理')

10.带参数验证功能装饰器

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 user_list=[
 4     {'name':'alex','passwd':'123'},
 5     {'name':'linhaifeng','passwd':'123'},
 6     {'name':'wupeiqi','passwd':'123'},
 7     {'name':'yuanhao','passwd':'123'},
 8 ]
 9 current_dic={'username':None,'login':False}
10 
11 def auth(auth_type='filedb'):
12     def auth_func(func):
13         def wrapper(*args,**kwargs):
14             print('认证类型是',auth_type)
15             if auth_type == 'filedb':
16                 if current_dic['username'] and current_dic['login']:
17                     res = func(*args, **kwargs)
18                     return res
19                 username=input('用户名:').strip()
20                 passwd=input('密码:').strip()
21                 for user_dic in user_list:
22                     if username == user_dic['name'] and passwd == user_dic['passwd']:
23                         current_dic['username']=username
24                         current_dic['login']=True
25                         res = func(*args, **kwargs)
26                         return res
27                 else:
28                     print('用户名或者密码错误')
29             elif auth_type == 'ldap':
30                 print('鬼才特么会玩')
31                 res = func(*args, **kwargs)
32                 return res
33             else:
34                 print('鬼才知道你用的什么认证方式')
35                 res = func(*args, **kwargs)
36                 return res
37 
38         return wrapper
39     return auth_func
40 
41 @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)
42 def index():
43     print('欢迎来到京东主页')
44 
45 @auth(auth_type='ldap')
46 def home(name):
47     print('欢迎回家%s' %name)
48 #
49 @auth(auth_type='sssssss')
50 def shopping_car(name):
51     print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
52 
53 # print('before-->',current_dic)
54 # index()
55 print('after--->',current_dic)
56 home('产品经理')
57 # shopping_car('产品经理')

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python之路【第七篇】:Python

    py3study
  • Python tcp socket 传送

    py3study
  • Python Day3

    #如果是windows平台一般还要加上一个小r,意思是取消路径中/的转义功能(不用写//了) #默认t,指的是文本文件,文本里面存放的是字符,因此涉及到字符编码...

    py3study
  • Python之路【第七篇】:Python

    py3study
  • Python的函数式编程

    ZONGLYN
  • Python多进程、多线程、协程

    在Unix/Linux中系统内核提供了fork系统调用来创建进程,根据不同的返回值来判断当前进程是子进程还是父进程,C语言代码示例如下:

    chain
  • python多线程与多进程--存活主机p

    在python里面,线程的创建有两种方式,其一使用Thread类创建 导入Python标准库中的Thread模块 from threading import ...

    py3study
  • python 装饰器案例解析

    执行的时候,不能写deco(test1()),为什么呢?这样写,是把test1函数执行的结果,传给deco了。

    py3study
  • python基础学习16----模块

    这种方式引入会相当于将模块中代码执行一遍,所以如果引入的模块中有输出语句,那么只写import 模块名,运行也会显示输出。

    py3study
  • 五、常用模块

    模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 conf...

    酱紫安

扫码关注云+社区

领取腾讯云代金券