装饰器是个好东西啊

那么装饰器是个什么样的东西呢,他又能做些什么呢?

1.为什么装饰器

当我们一个程序已经构建完成,并且已经发布出去了,但是现在需要增加一个活动,例如淘宝给你发送一个今日优惠,或者开启了一个双十一的活动。那么我们如何去做呢?

看一下下面的例子

1 def sai_hi():
2 print('hi')
3
4 def text(func):
5 print('活动开始')
6 func()
7 print('活动结束')
8 text(sai_hi)

答案是这样

活动开始
hi
活动结束

我们看到我们已经为这个sai_hi的活动增加了一个开始和结束的功能

但是还是不够完美

源代码在发布出去之后是不能随意修改的 ,因为一但修改源代码可能导致非常多的bug出现,越改越多

所以我们需要在不改变源代码的基础上为目标增加功能怎么做呢?

 1 def text(func):
2 def text1():
3 print("活动开始")
4 func()
5 print("后的结束")
6 return text
7
8 @text # 那么这个@text的意思就是 sai_hi=text(sai_hi)
9 def sai_hi():
10 print('hi')
11
12 sai_hi()

那么只需要这样就给函数安全的加上功能啦

那么当我们大函数需要传入参数呢?

 1 def timer(func):
2 def deco(*args,**kwargs):
3 satr_time = time.time()
4 func(*args,**kwargs)
5 stop_time = time.time()
6 print('the run time is %s' % (stop_time - satr_time))
7 return deco
8 @timer# text1=timer(text1)
9 def text1():
10 time.sleep(2)
11 print('in the text1')
12 @timer
13 def text2(name): # ------------------------------------------------------------------------------------往里面传值
14 time.sleep(3)
15 print('in the text2:',name)
16
17 text1()
18 text2('miki')

是不是只需要都在第二阶里面加上参数就可以了?

那么还有更高级的用法哦

这样想 当我们非常的的模块 现在其中有几个模块为了安全现在需要登录验证,然而有些却不要

或者是我现在要验证,可能过几天要向非会员什么的免费开放几天。这个时候问题来了

在不该边源代码的情况下怎么做?我们的装饰器最高阶版就可以完成这项工作

 1 name,password='miki','abc123'
2 def foo(auth_type):
3 print("the foo",auth_type)
4 def math(func):
5 print("in the math")
6 def deco(*args,**kwargs):
7 if(auth_type=='local'):
8 usename=input('your name:').strip()
9 usepassword=input('your password:').strip()
10 if(name==usename and password==usepassword):
11 print('\033[31;1m you success \033[0m')
12 res = func(*args,**kwargs)
13 return res # -----------------------------------原本装饰后使得func的返回值没有了 这里使得返回值出现
14 else:
15 print('\033[31;1m username or password error \033[0m')
16 elif(auth_type=='ldap'):
17 res = func(*args, **kwargs)
18 return res
19 return deco
20 return math
21 def index():
22 print('welcome to indext page')
23 @foo(auth_type='local') # home =foo(home)
24 def home(miki):
25 print('welcome to home page',name,miki)
26 return ' form home'
27 @foo(auth_type='ldap')
28 def bbs():
29 print('welcome to bbs page')
30 index()
31 miki=input('your age:')
32 home(miki)
33 bbs()

那么此时的foo里面传入的参数可以提供验证,当验证通过则免登录。

程序可以自行理解一下

最新文章

  1. python中string模块
  2. Fitnesse在eclipse中的调试
  3. Java获取字符串编码方式
  4. 微软MVP社区夏日巡讲北京站 7月13日星期六 微软北京望京Office
  5. 原创 | 《地狱边境》登顶50国iOS下载榜,恐怖游戏或是独立开发者突破口(转)
  6. Mahout学习之Mahout简介、安装、配置、入门程序测试
  7. linux gcc 编译时头文件和库文件搜索路径
  8. NHibernate执行原生带sum的sql
  9. Git Github jekyll,gem Liquid模板语言 Markdown
  10. 用Qemu搭建aarch32学习环境
  11. 201521123097《Java程序设计》第四周学习总结
  12. UVa1605,Building for UN
  13. (转)Apache从2.2换至2.4httpd.conf的调整笔记(windows环境)
  14. C++版 - 剑指offer 面试题63:二叉搜索树的第k个结点(二叉树中序遍历的应用) 题解
  15. 饿了么vue-cli3.0+cube-ui笔记
  16. iOS UI-三种简单的动画设置
  17. Mininet 系列实验(七)
  18. 安装OWA2013
  19. c++下使用邮槽实现进程间通信
  20. 使用react-redux开发的简单步骤

热门文章

  1. 【折半枚举+二分】POJ 3977 Subset
  2. JVM系列【6】GC与调优2.md
  3. C# 获取两点(经纬度表示)间的距离
  4. 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走
  5. 全网通4G工业路由器模块和串口转网口/4G/有线/WiFi/LTE模块的实现原理
  6. 2020-2021-1 20209306 《linux内核原理与分析》第三周作业
  7. javascript模块化(简)
  8. JavaScript监听滚动条的进度条
  9. vue-cli @4安装
  10. 学会这些CSS,再也不用切图!!!