Python 装饰器

装饰器:本质就是函数,功能是为其他函数添加附加功能

原则:

  a.不修改被修饰函数的源代码

  b.不修改被修饰函数的调用方式

公式:

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

高阶函数的定义:

  a.函数接收的参数是一个函数名

  b.函数的返回值是一个函数名

  c.满足上述条件任意一个,都可称之为高阶函数

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 
 5 def foo():
 6     print('你好呀!')
 7 
 8 
 9 def test(func):
10     func()
11 
12 
13 test(foo)
高阶函数条件一示例
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 
 5 def father(name):
 6     print('from father %s' %name)
 7 
 8     def son():
 9         print('from son')
10 
11         def grandson():
12             print('from grandson')
13         grandson()
14     son()
15 
16 
17 father('alex')
函数嵌套
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 
 5 
 6 def timmer(func):
 7     def wrapper():
 8         start_time = time.time()
 9         func()
10         stop_time = time.time()
11         print('函数运行时间 %s' % (stop_time - start_time))
12 
13     return wrapper
14 
15 
16 @timmer  # 第一种调用方式;@timmer 相当于 test = timmer(test)
17 def test():
18     time.sleep(3)
19     print('test函数运行完毕')
20 
21 
22 # test = timmer(test)  # 第二种调用方式 
23 # test()
24 
25 test()
装饰器的实现
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 
 5 
 6 def timmer(func):
 7     def wrapper():
 8         start_time = time.time()
 9         res = func()
10         stop_time = time.time()
11         print('函数运行时间 %s' % (stop_time - start_time))
12         return res
13     return wrapper
14 
15 
16 @timmer  # 第一种调用方式;@timmer 相当于 test = timmer(test)
17 def test():
18     time.sleep(3)
19     print('test函数运行完毕')
20     return '这是test的返回值'
21 
22 
23 res = test()
24 print(res)
装饰器加上返回值
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 
 5 
 6 def timmer(func):
 7     def wrapper(name, age):
 8         start_time = time.time()
 9         res = func(name, age)
10         stop_time = time.time()
11         print('函数运行时间 %s' % (stop_time - start_time))
12         return res
13     return wrapper
14 
15 
16 @timmer  # 第一种调用方式;@timmer 相当于 test = timmer(test)
17 def test(name, age):
18     time.sleep(3)
19     print('test函数运行完毕,姓名【 %s】,年龄【%s】' % (name, age))
20     return '这是test的返回值'
21 
22 
23 res = test('alex', 18)
24 print(res)
装饰器加上参数
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import time
 4 
 5 
 6 def timmer(func):
 7     def wrapper(*args, **kwargs):
 8         start_time = time.time()
 9         res = func(*args, **kwargs)
10         stop_time = time.time()
11         print('函数运行时间 %s' % (stop_time - start_time))
12         return res
13     return wrapper
14 
15 
16 @timmer  # 第一种调用方式;@timmer 相当于 test = timmer(test)
17 def test(name, age):
18     time.sleep(3)
19     print('test函数运行完毕,姓名【 %s】,年龄【%s】' % (name, age))
20     return '这是test的返回值'
21 
22 
23 @timmer  # 第一种调用方式;@timmer 相当于 test = timmer(test)
24 def test1(name, age,gender):
25     time.sleep(3)
26     print('test1函数运行完毕,姓名【 %s】,年龄【%s】,性别【%s】' % (name, age, gender))
27     return '这是test1的返回值'
28 
29 
30 res = test('alex', 18)
31 print(res)
32 
33 res1 = test1('alex', 18, '')
34 print(res1)
装饰器参数*args,**kwargs
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 ls = (11, 12, 13, 14, 15, 16, 17)
4 x, *_, z = ls
5 print(x)  # 获取序列中的第一个值 结果:11
6 print(_)  # 获取序列中的中间部分 结果:[12, 13, 14, 15, 16]
7 print(z)  # 获取序列中的最后一个值 结果:17
补充解压序列
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 f1 = 11
4 f2 = 12
5 f1, f2 = f2, f1
6 print(f1)  # 结果:12
7 print(f2)  # 结果:11
补充交换2个变量的值
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 
 5 def auth_func(func):
 6     def wrapper(*args, **kwargs):
 7         username = input('用户名:').strip()
 8         passwd = input('密码:').strip()
 9         if username == 'alex' and passwd == '123':
10             res = func(*args, **kwargs)
11             return res
12         else:
13             print('用户名或密码错误!')
14     return wrapper
15 
16 
17 @auth_func
18 def index():
19     print('欢迎来到淘宝首页')
20 
21 
22 @auth_func
23 def home(name):
24     print('欢迎回家[%s]' % name)
25 
26 
27 @auth_func
28 def shopping_car(name):
29     print('[%s]购物车里有【%s, %s, %s】' % (name, '苹果', '桔子', '葡萄'))
30 
31 
32 index()
33 home('alex')
34 shopping_car('alex')
装饰器添加验证用户登录功能

 

posted @ 2019-01-29 22:43  陈彦斌  阅读(336)  评论(0编辑  收藏  举报