<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
被裝飾物件加上裝飾器(戴了個帽子),被裝飾物件獲得了更強大的功能。
# 自定義裝飾器 def super_(func): def wrapper(): print('把內褲穿到外面來,變身超人') func() print('會飛!') return wrapper @super_ def man(): print('會走') # @super_原始語法結構 # man = super_(man) man()
執行結果如下:
''' 給有返回值的函數加上裝飾器 ''' import time def decorate(func): def wrapper(): print('開始執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) result = func() print('結束執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) return result return wrapper @decorate def normal_func(): time.sleep(1) print('normal_func執行中......') return 2 + 2 # @decorate原始語法結構 # normal_func = decorate(normal_func) print(normal_func())
執行結果如下:
''' 給有返回值和引數的函數加上裝飾器 ''' import time def decorate(func): def wrapper(*args, **kwargs): print('開始執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) result = func(*args, **kwargs) print('結束執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) return result return wrapper @decorate def normal_func1(a, b): time.sleep(1) print('normal_func1執行中......') return a + b @decorate def normal_func2(a, b, c): time.sleep(1) print('normal_func2執行中......') return a + b + c # @decorate原始語法結構 # normal_func1 = decorate(normal_func1) # normal_func2 = decorate(normal_func2) print(normal_func1(1, 2)) print(normal_func2(1, 2, 3))
執行結果如下:
可變引數原理:
1 定義時使用可變引數:在函數定義時使用args,在函數呼叫時,所有未匹配到的位置引數,會被放到args這個元組當中。
在函數定義時使用**kwargs,在函數呼叫時,所有未匹配到的關鍵字引數,會被放到kwargs這個字典當中。
2 呼叫時使用可變引數:在函數呼叫時使用args,是把args這個元組解包,元組內的每個元素作為函數的位置引數傳遞。
在函數呼叫時使用**kwargs,是把kwargs這個字典解包,字典內的每個元素作為函數的關鍵字引數傳遞。
def test1(a, b, c, d): print(a+b+c+d) print('傳統呼叫'.center(60, '=')) test1(1, 2, 3, 4) # 位置引數 test1(b=2, c=3, d=4, a=1) # 關鍵字引數 # 在函數定義時使用*args,在函數呼叫時,所有未匹配到的位置引數,會被放到args這個元組當中 # 在函數定義時使用**kwargs,在函數呼叫時,所有未匹配到的關鍵字引數,會被放到kwargs這個字典當中 def test2(*args, **kwargs): print(args) print(type(args)) print(kwargs) print(type(kwargs)) print('定義時使用可變引數'.center(60, '=')) test2(1, 2, 3, 4, b=5, c=6) # 在函數呼叫時使用*args,是把args這個元組解包,元組內的每個元素作為函數的位置引數傳遞。 # 在函數呼叫時使用**kwargs,是把kwargs這個字典解包,字典內的每個元素作為函數的關鍵字引數傳遞。 print('呼叫時使用可變引數'.center(60, '=')) test1(*(1, 2, 3, 4)) test1(**{'a':1, 'b':2, 'c':3, 'd':4}) test1(*(1, 2), **{'c':3, 'd':4})
執行結果如下:
''' 讓我還是那個我 ''' import time from functools import wraps def decorate(func): @wraps(func) # 把wrapper的內建屬性轉換成func的內建屬性(name/doc) def wrapper(*args, **kwargs): print('開始執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) result = func(*args, **kwargs) print('結束執行時間:' + time.strftime('%Y-%m-%d %H:%M:%S')) return result # wrapper.__name__ = func.__name__ # wrapper.__doc__ = func.__doc__ return wrapper @decorate def normal_func(a, b): ''' 這是一個測試函數 ''' time.sleep(1) print('normal_func1執行中......') return a + b print(normal_func.__name__) print(normal_func.__doc__)
對自動化測試指令碼需要增加紀錄檔列印功能:
import time from functools import wraps def log_decorator(func): @wraps(func) # 把wrapper的內建屬性轉換成func的內建屬性(name/doc) def wrapper(*args, **kwargs): print('測試用例[{}]開始執行'.format(func.__name__)) time_start = time.time() result = func(*args, **kwargs) time_end = time.time() print('測試用例[{}]執行完畢'.format(func.__name__)) print('測試用例[{}]執行耗時:%.2f秒'.format(func.__name__) % (time_end - time_start)) print('分割線'.center(60, '=')) return result return wrapper
到此這篇關於python裝飾器底層原理講解的文章就介紹到這了,更多相關python裝飾器底層原理講解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45