<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
裝飾器:給已有函數增加額外的功能的函數,本質上是一個閉包函數
特點:
import time # 裝飾器原理 # def show(): # n=0 # for i in range(10000000): # n+=i # print('show_',n) # # # 定義一個閉包 # def count_time(fun): # def inner(): # start=time.time() # fun() # end=time.time() # print(f'用時{end-start}秒') # return inner # # # 裝飾器在裝飾函數時的原理 # show=count_time(show) # show() # 定義裝飾器(語法糖) def count_time(fun): # 必須要有一個引數接收被裝飾函數 def inner(): start=time.time() fun() end=time.time() print(f'用時{end-start}秒') return inner # 裝飾器寫法:@閉包的外部函數,必須在閉包定以後使用 print('解析裝飾器1') @count_time # 解釋成show=count_time(show),show指向count_time函數中的inner def show(): n=0 for i in range(10000000): n+=i print('show_',n) print('解析裝飾器2') @count_time # 解釋成display=count_time(display) def display(): print('Display') print('正式執行...') show() display()
(當被裝飾函數有引數或者有返回值時同樣適用)
''' 裝飾器的通用型別的定義(當被裝飾函數有引數或者有返回值時同樣適用) ''' def outer(func): def inner(*args,**kwargs): # *為元組和列表解包,**為字典解包 print('*'*30) print(args,kwargs) ret=func(*args,**kwargs) # 解包,否則形參是元組或字典 print('*'*30) return ret return inner @outer def show(name,msg): return str(name)+' say: '+str(msg) print(show('Tom',msg='Hello'))
# 第一個閉包 def wrapper_div(func): def inner(*args,**kwargs): return '<div>'+func(*args,**kwargs)+'</div>' return inner # 第二個閉包 def wrapper_p(func): def inner(*args,**kwargs): return '<p>'+func(*args,**kwargs)+'</p>' return inner # 從下往上裝飾,從上往下執行 @wrapper_div @wrapper_p # 定義一個函數 def show(): return 'Short life I use Python.' print(show()) #<div><p>Short life I use Python.</p></div>
def outer1(func): def inner(): print('裝飾器1-1') func() print('裝飾器1-2') return inner def outer2(func): def inner(): print('裝飾器2-1') func() print('裝飾器2-2') return inner ''' 1.show指向outer1.inner 2.outer1.inner.func指向outer2.inner 3.outer2.inner.func指向show ''' @outer1 @outer2 def show(): print('Show...') show()
import time class Wrapper(): def __init__(self,func): self.func=func # 當類中實現了此方法時,該類的範例物件就變成了可呼叫物件,即可以在範例物件後面加() def __call__(self, *args, **kwargs): print('裝飾內容1...') start=time.time() ret=self.func(*args,**kwargs) end=time.time() print(f'執行了{end-start}秒') print('裝飾內容2...') return ret
該裝飾器執行完成後,被裝飾函數指向該類的範例物件
如果讓被裝飾函數執行,那麼在類中要新增__call__方法,相當於閉包格式中的內函數
一旦被裝飾函數執行呼叫,那麼就會去執行範例物件中的__call__函數
@Wrapper #解釋成show=Wrapper(show),show變成了類的一個物件 def show(): print('Show...') show() 6.裝飾器帶有引數(使用帶有引數的裝飾器,其實是在裝飾器外面又包裹了一個函數) # @Author : Kant # @Time : 2022/1/23 22:43 def set_args(msg): def outer(func): def inner(): print('裝飾內容',msg) func() return inner return outer ''' 使用帶有引數的裝飾器,其實是在裝飾器外面又包裹了一個函數,使用該函數接收引數,返回的是裝飾器 呼叫set_args()後會返回outer的地址參照,變成了@outer ''' @set_args('Hello') # 無論閉包函數寫成什麼樣子,被裝飾函數永遠指向閉包函數的內函數 def show(): print('Show...') show()
路由功能:通過請求的路徑,可以找到資源的地址
# 定義一個路由表字典 router_table={} def router(url): def wrapper(func): def inner(): print('1') print('inner-',func) # 檢視當前的被裝飾函數是誰 func() # 在這裡維護路由表字典 router_table[url]=inner # 如果寫func,inner函數中的內容都不會執行 print('路由表字典:',router_table) return inner return wrapper @router('index.html') def index(): print('首頁內容') @router('center.html') def center(): print('個人中心') @router('mail.html') def mail(): print('郵箱頁面') @router('login.html') def login(): print('登入頁面') def error(): print('存取頁面不存在') def request_url(url): func=error if url in router_table: func=router_table[url] func() print('開始執行函數') request_url('index.html') request_url('center.html') request_url('mail.html') request_url('test.html') request_url('login.html')
到此這篇關於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