python之路《八》装饰器
装饰器是个好东西啊
那么装饰器是个什么样的东西呢,他又能做些什么呢?
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里面传入的参数可以提供验证,当验证通过则免登录。
程序可以自行理解一下
python之路《八》装饰器的更多相关文章
- 小白的Python之路 day4 装饰器前奏
装饰器前奏: 一.定义: 1.装饰器本质是函数,语法都是用def去定义的 (函数的目的:他需要完成特定的功能) 2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能) 二.原则: 1. 不能 ...
- python之路之装饰器
一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...
- [Python之路] 使用装饰器给Web框架添加路由功能(静态、动态、伪静态URL)
一.观察以下代码 以下来自 Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦) 中的mini_frame最后版本的代码: import time def in ...
- 小白的Python之路 day4 装饰器高潮
首先装饰器实现的条件: 高阶函数+嵌套函数 =>装饰器 1.首先,我们先定义一个高级函数,去装饰test1函数,得不到我们想要的操作方式 import time #定义高阶函数 def deco ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...
- guxh的python笔记三:装饰器
1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- python 3.x 的装饰器笔记
今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
随机推荐
- Spring Boot 系列:日志动态配置详解
世界上最快的捷径,就是脚踏实地,本文已收录架构技术专栏关注这个喜欢分享的地方. 开源项目: 分布式监控(Gitee GVP最有价值开源项目 ):https://gitee.com/sanjianket ...
- Linux发行版教你如何选 给入门者的选择通法
Linux的发行版何止琳琅满目,简直是乱入你眼. 本篇将介绍选择发行版的经验和通用法则,主要会从PC角度去谈. 更新于2020年,初次发布于2017年 选择发行版需考虑哪些因素 选择发行版时需要考虑的 ...
- 【Luogu】P1613 跑路
[Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资 ...
- spring boot:发送带附件的邮件和html内容的邮件(以163.com邮箱为例/spring boot 2.3.2)
一,网站哪些情况下需要发送电子邮件? 作为一个电商网站,以下情况需要发邮件通知用户: 注册成功的信息 用邮箱接收验证码 找回密码时发链接 发送推广邮件 下单成功后的订单通知 给商户的对账单邮件 说明: ...
- 【应用服务 App Service】在Azure App Service中使用WebSocket - PHP的问题 - 如何使用和调用
问题描述 在Azure App Service中,有对.Net,Java的WebSocket支持的示例代码,但是没有成功的PHP代码. 以下的步骤则是如何基于Azure App Service实现PH ...
- CentOS 网卡固定地址配置
修改4个文件后重启网卡 vim /etc/default/grub GRUB_CMDLINE_LINUX="resume=UUID=05dbb36b-dbba-40a3-ba99-1b044 ...
- springboot入门系列(一):简单搭建springboot项目
Spring Boot 简单介绍 Spring Boot 本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架的应用程序.也就是说,它并不是用来替代S ...
- UI-个人作品集
前言 现在需要将之前做过的UI设计集起来,并做些好看的设计 设计思路 开头>技能>作品>结束 开头 我使用线条来构图 以及比较融合的背景进行衬托主题 技能 通过文字与图形搭配展示出我 ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
- 《3D打印与工业制造》个人总结 —— 周吉瑞
<3D打印与工业制造>个人总结 ---- 周吉瑞 JERRY_Z. ~ 2020 / 10 / 24 转载请注明出处!️ 目录 <3D打印与工业制造>个人总结 ---- 周吉瑞 ...