装饰器的作用
相信大家在
探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍。
这次小冰也来讲解一下关于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实践代码,肯行跑不起来,哈哈哈。_仅供参考_哟~~~