简单介绍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 and password==acAndPas:
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实践代码,肯行跑不起来,哈哈哈。_仅供参考_哟~~~**
本文编辑使用Markdown。
参考 参考 好复杂的样子,我正在学python,等回头再来学习下,现在基本的语法还没弄明白,这个根本看不懂,只能看个大概 感谢楼主 感谢楼主 感谢楼主!都快忘记了,原理还是没有搞太明白 厉害,居然还有加密解密模块 感谢楼主的分享,如果再说的详细一些更好了。 一直觉得装饰器不太好理解,谢谢楼主的讲解 中间那个例子运行的话电脑就跪了。。。运算量太大了
页:
[1]
2