python简单装饰器_简单介绍Python装饰器(一)
装饰器的作用
相信大家在
探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍。
这次小冰也来讲解一下关于Python装饰器的一些小知识。
它的作用:
性能测试
日志
安全验证
......
相信大家已经迫不及待的想知道怎么个用法啦~
就用性能测试这个话题来说吧。
比如测试运行时间
比如我们要测试执行一个函数要花的时间。
我们可以这样子写:
#-*-coding:utf-8-*-
import time
def foo():
pass
start = time.time()
foo()
end = time.time()
print("运行耗时:", end - start)
看起来暂时没什么压力对吧。
好的,我们如果我们要对一大堆函数进行性能测试,那么我们要写多少个重复的代码呀,这得浪费多少时间呀。
这会咋们有救啦!用装饰器!
#-*-coding:utf-8-*-
import math
#装饰器
def test(func):
def wrapper():
start = time.time()
#执行要测试的函数
func()
end = time.time()
print(func.__name__, "运行耗时:", end - start)
return wrapper
@test
def foo1():
pass
@test
def = foo2():
pass
# .......
@test
def foon():
pass
#执行函数
foo1()
foo2()
foon()
emmmm开始有点样子了~~
但这是个什么原理呢?
小冰就用一点都不专业的方式给大家解释解释:
首先,我们先写好一个装饰器函数,装饰器是要给Py解释器看的,当然想让它看中你就得包装好啦。比如上面的装饰器test中的wrapper是干啥子的?!!wrapper就是把装饰好的函数给Py解释器,让他去执行。
那要给函数传参数怎么办!!!Σ(*゚д゚ノ)ノ
那要取回函数的返回值怎么办!!!(|||゚д゚)
别着急,咋们给这个test再升级!
看代码:
#-*-coding:utf-8-*-
import time
def test(func):
def wrapper(n):
start = time.time()
ret = func(n)
end = time.time()
print(func.__name__, "运行耗时:", end - start)
return ret
return wrapper
#这回就来测一测循环运行n次所消耗的时间吧
@test
def counter(n):
ret = 0
#来个猛一点
for number in range(n**n):
x = number ** number
y = number ** number ** number
ret += x ** y
return ret
#运行函数
retNum1 = counter(520)
retNum2 = counter(1314)
print("结果1:", retNum1)
print("结果2:", retNum2)
到这里相信大家对这个神秘而又,,,忘词了,不管他…
来实践一下吧,这回咋们弄一个安全验证。
#-*-coding:utf-8-*-
#这个是加密解密模块
#jiamijiemi.py
import xxx
from xxxx import xx
#假装我们已经写好了对账户密码进行加密和解密的函数。
__all__ = ["jiaMi", "jieMi"]
#加密
def jiaMi(data):
pass
return reData #加密后的数据
#解密
def jieMi(data)
pass
return reData #解密后的数据
emmmm,还有一个存相互密码的加密文本呢。
key.jiami 假装这是一个加密过的文本
account:小冰哟
password:lovingxiaobing
比如我们有一个函数,要去运行它要有权限,权限哪里来呢,要登录才能得到权限去运行它,怎么做么,看我操作!!!
#-*-coding:utf-8-*-
from jiamijiemi import *
#安全验证
def login(mySecretFunc):
def run(**kw):
with open("key.jiami", "rb") as data
#假装在解密
kansee = jieMi(data.read())
acAndPas = kansee.split("\n")
account = input("输入账号:")
password = input("输入密码:")
if account==acAndPas[0] and password==acAndPas[1]:
print("暖心小提示:看看周围有没有人再调高音量哟")
return mySecretFun(**kw)
else:
raise ValueError("登录验证失败!")
return run
@login
def findMyGirl(**kw):
name = kw.get("name", None)
#默认视频
types = kw.get("types", "movie")
if name==None:
print("乱来,先别激动")
exit(-1)
#这里省略n行代码,查找隐藏在硬盘里的女神
#这个是查找到的结果
#resultList
return resultList
movie = findMyGirl(name = "仓xx", types = "movie")
pic = findMyGirl(name = "xx麻子xx依", types = "pictrue")
print("查找到的电影:", movie)
print("查找到的图片:", pic)
我:还有么?
python:当然了~~
我: (゚д゚≡゚д゚)
python:我不仅会用函数装饰器来打扮,而且还有类装饰器呢~~ ㄟ(≧◇≦)ㄏ
我: Σ( ° △ °)
我和Python:敬请期待下一期吧~~~
你们肯定偷偷的copy实践代码,肯行跑不起来,哈哈哈。_仅供参考_哟~~~
python简单装饰器_简单介绍Python装饰器(一)相关推荐
- python中整型_实例介绍Python中整型
实例介绍Python中整型 Python中有以下几个基本的数据类型: 整数 int 字符串 str 浮点数 float 集合 set 列表 list 元组 tuple 字典 dict 布尔类型 boo ...
- python or的用法_详细介绍Python中and和or实际用法
and 和 or 的特殊性质 在Python 中,and 和 or 执行布尔逻辑演算,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一.下面来看一下实例.>>> 'a' a ...
- python链表详细教程_详细介绍python数据结构之链表
这篇文章主要为大家详细介绍了python数据结构之链表的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有 ...
- java和python结合做项目_由浅入深Java+Python结合项目实战
[课程内容] [初级项目:图片社交+电商导购+漂流瓶] 项目实现功能: 用户注册,登录,登出图片的多种上传方式,删除首页图片分类,排序和分页个人页管理图片分享 课程内容: 开发工具和Python语言介 ...
- python中len用法_简单介绍Python中的len()函数的使用
简单介绍Python中的len()函数的使用 函数:len() 1:作用:返回字符串.列表.字典.元组等长度 2:语法:len(str) 3:参数:str:要计算的字符串.列表.字典.元组等 4:返回 ...
- 什么是python装饰器_深入理解 Python 装饰器
作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...
- python实现ping命令_[小菜随笔]python tkinter实现简单的ping命令
本文主要是介绍python图形界面上的按键与实际功能的对接,其实编程掌握了基础之后的学习应该都是靠自己去挖掘其他的 在网上发现多半教程都是2的,故本文使用的是python3.5,其实也没什么区别,就有 ...
- python opencv 界面按钮_如何使用Python构建简单的UI?
借助Streamlit框架,使用用户界面展示Python项目变得前所未有的简单,你可以仅仅使用Python代码来构建基于浏览器的UI.本次演示将为迷宫求解器程序构建UI.StreamlitStream ...
- python中输入字符串_简单讲解Python中的字符串与字符串的输入输出
简单讲解Python中的字符串与字符串的输入输出 发布于 2016-03-26 14:35:42 | 110 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向 ...
最新文章
- 看懂OpenCV中IplImage转换成CvMat的语句:CvMat sstub, *src = cvGetMat(srcarr, sstub);
- 国家电网公司“SG186”工程总部企业门户开发实施
- windows 10占用cpu和内存过高
- 逃离数学焦虑、算法选择,思考做好机器学习项目的3个核心问题
- 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别
- 张萍萍山东大学计算机科学系毕业生,并行驰骋,放“码”来战!看先导杯大奖赛上山大风采...
- linux aio拷贝文件,Linux通过AIO进行异步读文件
- thinkphp 捕捉错误
- ldap 测试表设计
- OpenCV实战 | 低对比度缺陷检测应用实例--LCD屏幕脏污检测
- Ubuntu18.04安装CAJ阅读器
- uniapp上拉加载
- ElasticSearch已有字段添加Fields
- mysql myisam转innodb_WordPressMySQL数据库MyISAM表转换InnoDB方法和修复工具
- [BZOJ 3653] 谈笑风生
- Android Design - 设计风格
- 【Arduino】关于使用USB-ISP烧入bootloader的一些记录
- 2018年度锦鲤已出! 抽中奖的重点是什么?
- Meta宣布大裁员,超11000人!毕业前夜员工瑟瑟发抖,坐等明早的大礼包开奖!...
- SEO写作中五个最常见的问题