什么是裝飾器?
裝飾器就是用來裝飾函數。
想要增強原有函數的功能
但不希望修改原有函數的定義
在代碼運行期間動態增加功能的方式
函數嵌套函數調用方式:
原函數 = 外層函數(原函數名)
原函數
def desc(fun): def add_info(): print("happy today") fun() print("westos_linux") return add_info def login(): print("login..") login = desc(login) login()
def add_info(fun): print("happy today") fun() print("westos_linux") def login(): print("login..") def logout(): print("logout..") def save(): print("save..") def trans(): print("trans") add_info(login) add_info(logout) login = add_info(login)裝飾器使用
定義的裝飾器實質是返回函數的高階函數
@timeIt(裝飾器名) 這里是 python 提供的一個語法糖
1.解決問題:函數執行前后添加功能-->會改變函數調用命令
2.不改變原有函數的調用方式-->函數里面嵌套函數,并且不改變返回嵌套函數的調用方式-->login = desc(login)
需求:獲取每個函數的執行時間 #1.函數執行之前計算時間 #2.函數執行之后計算時間 import random import string import time from functools import reduce li = [random.choice(string.ascii_letters +string.digits) for i in range(10) ] def timeit(fun): def wrapper(*args,**kwargs): t1=time.time() res = fun(*args,**kwargs) t2 = time.time() grot = t2-t1 print("所需時間:%.6f" %grot) return res return wrapper @timeit def myjoin(*args,**kwargs): s = ",".join(*args,**kwargs) print(s) myjoin(li)日志裝飾器
#創建裝飾器 #1.創建add_log裝飾器,被裝飾函數打印日志信息 #2.日志格式為:[字符串時間] 函數名:XXX 運行時間:XXXX 運行返回值結果:XXXX import time import functools import math def add_log(fun): @functools.wraps(fun) def wrapper(*args,**kwargs): run_time =time.ctime() start_time = time.time() res = fun(*args,**kwargs) end_time = time.time() na = fun.__name__ print("[字符串時間:%s] 函數名:%s 運行時間:%.6f 運行返回值結果:%s" %(run_time,na,end_time-start_time,res)) return res return wrapper @add_log def mymult(x,y): """這是一個求x的y次方的函數""" return math.pow(x,y) mymult(2,3)登陸驗證
#用戶登錄驗證的裝飾器is_login # 如果用戶登陸成功,則執行被裝飾的函數 # 如果用戶登陸不成功,則執行登陸函數 users =["root","sheen"] def is_login(fun): def wrapper(*args,**kwargs): if kwargs.get("name") in users: res = fun(*args,**kwargs) else: res = login() return res return wrapper @is_login def writeblog(name): return "wirte,now.." def login(): return "please login.." print(writeblog(name="star"))類型判斷(無參)
#1.基礎版(無參數) #編寫裝飾器required_ints # 確保函數收到的每一個參數都是整數 # 如果參數不是整形數,打印TypeError import functools def required_ints(fun): @functools.wraps(fun) def wrapper(*args,**kwargs): for i in args: if not isinstance(i,int): print("TypeError") break else: res = fun(*args,**kwargs) return res return wrapper @required_ints def myadd(a,b): return a+b print(myadd(1,2.0))含參類型判斷
# #帶參數的裝飾器 # """ # 裝飾器為required_types # 當裝飾器為@required_types(int,float),確保函數接收到的每一個參數都是int/float類型 # 當裝飾器為@required_types(list),確保函數接收到的每一個參數都是list類型 # 當裝飾器為@required_types(str,int),確保函數接收到的每一個參數都是str/int類型 # 如果參數不滿足條件,打印TypeError,參數必須是XXXXX類型 import functools def required_types(*kinds): #kinds元組 def required_ints(fun): @functools.wraps(fun) def wrapper(*args,**kwargs): for i in args: if not isinstance(i,kinds): print("TypeError,參數類型為",kinds) break else: res = fun(*args,**kwargs) return res return wrapper return required_ints @required_types(int,str) def my(a,b): return a,b print(my(1,"sdhs"))帶有多個裝飾器
def makebold(fun): print("makebold") def wrapper1(*args,**kwargs): print("bold") return fun(*args,**kwargs) return wrapper1 def makei(fun): print("makei") def wrapper(*args,**kwargs): print("i") return fun(*args, **kwargs) return wrapper #wrapper=login #當有多個裝飾器時,從下到上調用裝飾器 #真實wrapper內容是從上到下執行的 @makebold #login = makebold(login) #login為wrapper1 @makei #login = makei(login) #login為wrapper def login(): return "登陸" print(login())
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42276.html
摘要:模塊是一個文件,以結尾,包含了對象定義和語句模塊讓你能夠有邏輯地組織你的代碼段。把相關的代碼分配到一個模塊里能讓你的代碼更好用,更易懂。命令執行成功,執行結果命令執行失敗一秒后執行關機命令 Python 模塊(Module) 是一個 Python 文件,以 .py 結尾,包含了 Python 對象定義和Python語句 模塊讓你能夠有邏輯地組織你的 Python 代碼段。 把相關的代...
摘要:什么是包為了組織好模塊,會將多個模塊分為包。處理包也是相當方便的。簡單來說,包就是文件夾,但該文件夾下必須存在文件。最簡單的情況下,只需要一個空的文件即可。當然它也可以執行包的初始化代碼包底下也能包含包,這和文件夾一樣,還是比較好理解的。 什么是包? 為了組織好模塊,會將多個模塊分為包。Python 處理包也是相當方便的。簡單來說,包就是文件夾,但該文件夾下必須存在 __init__....
摘要:什么是裝飾者模式今天我們來講另外一個非常實用的設計模式裝飾者模式。就增加功能來說,裝飾者模式相比生成子類更為靈活。下面,裝飾者模式就要正式登場了。下一步,我們可以愉快的去使用裝飾者模式啦 什么是裝飾者模式 今天我們來講另外一個非常實用的設計模式:裝飾者模式。這個名字聽上去有些莫名其妙,不著急,我們先來記住它的一個別名:包裝器模式。 我們記著這兩個名字來開始今天的文章。 首先還是上《設計...
摘要:使用類裝飾器,優點是靈活性大,高內聚,封裝性。不過不用擔心,有,本身也是一個裝飾器,它的作用就是把原函數的元信息拷貝到裝飾器函數中,使得裝飾器函數也有和原函數一樣的元信息。 showImg(https://segmentfault.com/img/bVbrFWb?w=742&h=484);Python的裝飾器(decorator)是一個很棒的機制,也是熟練運用Python的必殺技之一。...
摘要:前言繼續向下看廖大教程,看到了函數式編程這一節,當時是覺得沒啥用直接跳過了,這次準備要仔細看一遍了,并記錄下一些心得。 前言 繼續向下看廖大教程,看到了函數式編程這一節,當時是覺得沒啥用直接跳過了,這次準備要仔細看一遍了,并記錄下一些心得。 函數式編程 上學期有上一門叫 人工智能 的課,老師強行要我們學了一個叫做 prolog 的語言,哇那感覺確實難受,思維方式完全和之前學過的不一樣,...
閱讀 2577·2019-08-30 10:53
閱讀 3183·2019-08-29 16:20
閱讀 2933·2019-08-29 15:35
閱讀 1750·2019-08-29 12:24
閱讀 2865·2019-08-28 18:19
閱讀 1838·2019-08-23 18:07
閱讀 2313·2019-08-23 15:31
閱讀 1157·2019-08-23 14:05