python 14 装饰器
生活随笔
收集整理的這篇文章主要介紹了
python 14 装饰器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
今日內容大綱
昨天內容回顧以及作業(yè)講解
匿名函數(shù):一句話函數(shù)。 多于內置函數(shù),列表推導式結合。
內置函數(shù): *** 加key的。min,max,sorted,map,reduce,filter
閉包:
今日內容
開放封閉原則:
裝飾器:裝飾,裝修,房子就可以住,如果裝修,不影響你住,而且體驗更加,讓你生活中增加了很多功能:洗澡,看電視,沙發(fā)。 器:工具。 開放封閉原則: 開放:對代碼的拓展開放的, 更新地圖,加新槍,等等。 封閉:對源碼的修改是封閉的。閃躲用q。就是一個功能,一個函數(shù)。 別人赤手空拳打你,用機槍掃你,扔雷.....這個功能不會改變。裝飾器:完全遵循開放封閉原則。 裝飾器: 在不改變原函數(shù)的代碼以及調用方式的前提下,為其增加新的功能。 裝飾器就是一個函數(shù)。裝飾器的初識:
- 版本一: 大壯 寫一些代碼測試一下index函數(shù)的執(zhí)行效率。
版本二:利用函數(shù),解決代碼重復使用的問題
import time def index():'''有很多代碼.....'''time.sleep(2) # 模擬的網(wǎng)絡延遲或者代碼效率print('歡迎登錄博客園首頁') # index() def dariy():'''有很多代碼.....'''time.sleep(3) # 模擬的網(wǎng)絡延遲或者代碼效率print('歡迎登錄日記頁面')def timmer(f): # f= indexstart_time = time.time()f() # index()end_time = time.time()print(f'測試本函數(shù)的執(zhí)行效率{end_time-start_time}') timmer(index)版本二還是有問題: 原來index函數(shù)源碼沒有變化,給原函數(shù)添加了一個新的功能測試原函數(shù)的執(zhí)行效率的功能。 滿足開放封閉原則么?原函數(shù)的調用方式改變了。版本三:不能改變原函數(shù)的調用方式。
# import time # def index(): # '''有很多代碼.....''' # time.sleep(2) # 模擬的網(wǎng)絡延遲或者代碼效率 # print('歡迎登錄博客園首頁') # # def timmer(f): # f = index (funciton index123) # def inner(): # inner :(funciton inner123) # start_time = time.time() # f() # index() (funciton index123) # end_time = time.time() # print(f'測試本函數(shù)的執(zhí)行效率{end_time-start_time}') # return inner # (funciton inner123) # timmer(index) # index() # ret = timmer(index) # inner # ret() # inner() # index = timmer(index) # inner (funciton inner123) # index() # inner() # def func(): # print('in func') # # def func1(): # print('in func1') # # # func() # # func1() # func() # func = 666 # func(0)版本四:具體研究
import time def index():'''有很多代碼.....'''time.sleep(2) # 模擬的網(wǎng)絡延遲或者代碼效率print('歡迎登錄博客園首頁')def timmer(f):f = index# f = <function index at 0x0000023BA3E8A268>def inner():start_time = time.time()f()end_time = time.time()print(f'測試本函數(shù)的執(zhí)行效率{end_time-start_time}')return innerindex = timmer(index) index()版本五:python做了一個優(yōu)化;提出了一個語法糖的概念。 標準版的裝飾器
import time # timmer裝飾器 def timmer(f):def inner():start_time = time.time()f()end_time = time.time()print(f'測試本函數(shù)的執(zhí)行效率{end_time-start_time}')return inner# @timmer # index = timmer(index) def index():'''有很多代碼.....'''time.sleep(0.6) # 模擬的網(wǎng)絡延遲或者代碼效率print('歡迎登錄博客園首頁')return 666 ret = index() print(ret)def dariy():'''有很多代碼.....'''time.sleep(3) # 模擬的網(wǎng)絡延遲或者代碼效率print('歡迎登錄日記頁面') dariy() # index = timmer(index) # index() # dariy = timmer(dariy) @timmer dariy()版本六:被裝飾函數(shù)帶返回值
import time # timmer裝飾器 def timmer(f):# f = indexdef inner():start_time = time.time()# print(f'這是個f():{f()}!!!') # index()r = f()end_time = time.time()print(f'測試本函數(shù)的執(zhí)行效率{end_time-start_time}')return rreturn inner@timmer # index = timmer(index) def index():'''有很多代碼.....'''time.sleep(0.6) # 模擬的網(wǎng)絡延遲或者代碼效率print('歡迎登錄博客園首頁')return 666 # 加上裝飾器不應該改變原函數(shù)的返回值,所以666 應該返回給我下面的ret, # 但是下面的這個ret實際接收的是inner函數(shù)的返回值,而666返回給的是裝飾器里面的 # f() 也就是 r,我們現(xiàn)在要解決的問題就是將r給inner的返回值。 ret = index() # inner() print(ret)版本七:被裝飾函數(shù)帶參數(shù)
import time # timmer裝飾器 def timmer(f):# f = indexdef inner(*args,**kwargs):# 函數(shù)的定義:* 聚合 args = ('李舒淇',18)start_time = time.time()# print(f'這是個f():{f()}!!!') # index()r = f(*args,**kwargs)# 函數(shù)的執(zhí)行:* 打散:f(*args) --> f(*('李舒淇',18)) --> f('李舒淇',18)end_time = time.time()print(f'測試本函數(shù)的執(zhí)行效率{end_time-start_time}')return rreturn inner@timmer # index = timmer(index) def index(name):'''有很多代碼.....'''time.sleep(0.6) # 模擬的網(wǎng)絡延遲或者代碼效率print(f'歡迎{name}登錄博客園首頁')return 666 index('納欽') # inner('納欽')@timmer def dariy(name,age):'''有很多代碼.....'''time.sleep(0.5) # 模擬的網(wǎng)絡延遲或者代碼效率print(f'歡迎{age}歲{name}登錄日記頁面') dariy('李舒淇',18) # inner('李舒淇',18) 標準版的裝飾器;def wrapper(f):def inner(*args,**kwargs):'''添加額外的功能:執(zhí)行被裝飾函數(shù)之前的操作'''ret = f(*args,**kwargs)''''添加額外的功能:執(zhí)行被裝飾函數(shù)之后的操作'''return retreturn inner
裝飾器的應用
# 裝飾器的應用:登錄認證 # 這周的周末作業(yè):模擬博客園登錄的作業(yè)。裝飾器的認證功能。def login():passdef register():passstatus_dict = {'username': None,'status': False, }def auth(f):'''你的裝飾器完成:訪問被裝飾函數(shù)之前,寫一個三次登錄認證的功能。登錄成功:讓其訪問被裝飾得函數(shù),登錄沒有成功,不讓訪問。:param f::return:'''def inner(*args,**kwargs):'''訪問函數(shù)之前的操作,功能'''if status_dict['status']:ret = f(*args,**kwargs)'''訪問函數(shù)之后的操作,功能'''return retelse:username = input('請輸入用戶名').strip()password = input('請輸入密碼').strip()if username == 'taibai' and password == '123':print('登錄成功')status_dict['username'] = usernamestatus_dict['status'] = Trueret = f(*args, **kwargs)return retelse:print('登錄失敗')return inner @auth # article = auth(article) def article():print('歡迎訪問文章頁面') @auth def comment():print('歡迎訪問評論頁面') @auth def dariy():print('歡迎訪問日記頁面')article() # inner() comment() #inner() dariy()今日總結
預習內容
預習內容我會以md文件發(fā)到群里。
轉載于:https://www.cnblogs.com/miseryGOD/p/10879334.html
總結
以上是生活随笔為你收集整理的python 14 装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MCPlayerKit 0.0.6 Re
- 下一篇: Redis【3】其他部分~