python简单装饰器_简单介绍Python装饰器(一)
裝飾器的作用
相信大家在
探索過程中已經(jīng)了解裝飾器的作用,也有很多花里胡哨的介紹。
這次小冰也來講解一下關(guān)于Python裝飾器的一些小知識(shí)。
它的作用:
性能測試
日志
安全驗(yàn)證
......
相信大家已經(jīng)迫不及待的想知道怎么個(gè)用法啦~
就用性能測試這個(gè)話題來說吧。
比如測試運(yùn)行時(shí)間
比如我們要測試執(zhí)行一個(gè)函數(shù)要花的時(shí)間。
我們可以這樣子寫:
#-*-coding:utf-8-*-
import time
def foo():
pass
start = time.time()
foo()
end = time.time()
print("運(yùn)行耗時(shí):", end - start)
看起來暫時(shí)沒什么壓力對吧。
好的,我們?nèi)绻覀円獙σ淮蠖押瘮?shù)進(jìn)行性能測試,那么我們要寫多少個(gè)重復(fù)的代碼呀,這得浪費(fèi)多少時(shí)間呀。
這會(huì)咋們有救啦!用裝飾器!
#-*-coding:utf-8-*-
import math
#裝飾器
def test(func):
def wrapper():
start = time.time()
#執(zhí)行要測試的函數(shù)
func()
end = time.time()
print(func.__name__, "運(yùn)行耗時(shí):", end - start)
return wrapper
@test
def foo1():
pass
@test
def = foo2():
pass
# .......
@test
def foon():
pass
#執(zhí)行函數(shù)
foo1()
foo2()
foon()
emmmm開始有點(diǎn)樣子了~~
但這是個(gè)什么原理呢?
小冰就用一點(diǎn)都不專業(yè)的方式給大家解釋解釋:
首先,我們先寫好一個(gè)裝飾器函數(shù),裝飾器是要給Py解釋器看的,當(dāng)然想讓它看中你就得包裝好啦。比如上面的裝飾器test中的wrapper是干啥子的?!!wrapper就是把裝飾好的函數(shù)給Py解釋器,讓他去執(zhí)行。
那要給函數(shù)傳參數(shù)怎么辦!!!Σ(*゚д゚ノ)ノ
那要取回函數(shù)的返回值怎么辦!!!(|||゚д゚)
別著急,咋們給這個(gè)test再升級!
看代碼:
#-*-coding:utf-8-*-
import time
def test(func):
def wrapper(n):
start = time.time()
ret = func(n)
end = time.time()
print(func.__name__, "運(yùn)行耗時(shí):", end - start)
return ret
return wrapper
#這回就來測一測循環(huán)運(yùn)行n次所消耗的時(shí)間吧
@test
def counter(n):
ret = 0
#來個(gè)猛一點(diǎn)
for number in range(n**n):
x = number ** number
y = number ** number ** number
ret += x ** y
return ret
#運(yùn)行函數(shù)
retNum1 = counter(520)
retNum2 = counter(1314)
print("結(jié)果1:", retNum1)
print("結(jié)果2:", retNum2)
到這里相信大家對這個(gè)神秘而又,,,忘詞了,不管他…
來實(shí)踐一下吧,這回咋們弄一個(gè)安全驗(yàn)證。
#-*-coding:utf-8-*-
#這個(gè)是加密解密模塊
#jiamijiemi.py
import xxx
from xxxx import xx
#假裝我們已經(jīng)寫好了對賬戶密碼進(jìn)行加密和解密的函數(shù)。
__all__ = ["jiaMi", "jieMi"]
#加密
def jiaMi(data):
pass
return reData #加密后的數(shù)據(jù)
#解密
def jieMi(data)
pass
return reData #解密后的數(shù)據(jù)
emmmm,還有一個(gè)存相互密碼的加密文本呢。
key.jiami 假裝這是一個(gè)加密過的文本
account:小冰喲
password:lovingxiaobing
比如我們有一個(gè)函數(shù),要去運(yùn)行它要有權(quán)限,權(quán)限哪里來呢,要登錄才能得到權(quán)限去運(yùn)行它,怎么做么,看我操作!!!
#-*-coding:utf-8-*-
from jiamijiemi import *
#安全驗(yàn)證
def login(mySecretFunc):
def run(**kw):
with open("key.jiami", "rb") as data
#假裝在解密
kansee = jieMi(data.read())
acAndPas = kansee.split("\n")
account = input("輸入賬號(hào):")
password = input("輸入密碼:")
if account==acAndPas[0] and password==acAndPas[1]:
print("暖心小提示:看看周圍有沒有人再調(diào)高音量喲")
return mySecretFun(**kw)
else:
raise ValueError("登錄驗(yàn)證失敗!")
return run
@login
def findMyGirl(**kw):
name = kw.get("name", None)
#默認(rèn)視頻
types = kw.get("types", "movie")
if name==None:
print("亂來,先別激動(dòng)")
exit(-1)
#這里省略n行代碼,查找隱藏在硬盤里的女神
#這個(gè)是查找到的結(jié)果
#resultList
return resultList
movie = findMyGirl(name = "倉xx", types = "movie")
pic = findMyGirl(name = "xx麻子xx依", types = "pictrue")
print("查找到的電影:", movie)
print("查找到的圖片:", pic)
我:還有么?
python:當(dāng)然了~~
我: (゚д゚≡゚д゚)
python:我不僅會(huì)用函數(shù)裝飾器來打扮,而且還有類裝飾器呢~~ ㄟ(≧◇≦)ㄏ
我: Σ( ° △ °)
我和Python:敬請期待下一期吧~~~
你們肯定偷偷的copy實(shí)踐代碼,肯行跑不起來,哈哈哈。_僅供參考_喲~~~
總結(jié)
以上是生活随笔為你收集整理的python简单装饰器_简单介绍Python装饰器(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝莓多少钱一斤啊?
- 下一篇: 11月去缅甸有什么好玩的,11月去缅甸要