日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python成长之路_装饰器

發布時間:2025/3/15 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python成长之路_装饰器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、初入裝飾器

1、首先呢我們有這么一段代碼,這段代碼假設是N個業務部門的函數 1 def f1(aaa): 2 print('我是F1業務') 3 if aaa == 'f1': 4 return 'ok' 5 6 def f2(aaa): 7 print('我是F2業務') 8 if aaa == 'f2': 9 return 'ok' 業務代碼

這里的函數的意思就是當我們調用上面的函數的時候,傳入值給aaa,當aaa的值等于f1或者f2就返回ok

2、公司有N個業務部門,1個基礎平臺部門,基礎平臺負責提供底層的功能,如:數據庫操作、redis調用、監控API等功能。業務部門使用基礎功能時,只需調用基礎平臺提供的功能即可。那么我們業務部門調用功能的時候只需要。

f1(值)

f2(值)

3、公司的運行正在有條不穩的進行,然而有一天呢,你的老大說,我發現了一個問題就是呢業務部調用基礎平臺的功能的時候沒有驗證這樣不好所以呢老大就把工作交給了LOW們,要求增加驗證功能并且業務部門在調用功能的方式不能變

Low A,這個A呢他是這么做的

他呢跟各個做基礎功能的人協調,要求在自己的代碼上加入驗證模塊,那么這樣呢整個的基礎平臺就不需要更改,結果,Low A當天就被開除了……

Low B,這個B呢一看A都被開除了不行上面的方法不行哪就換一個

1 def f1(aaa): 2 #驗證代碼 3 #驗證代碼 4 print('我是F1業務') 5 if aaa == 'f1': 6 return 'ok' 7 8 def f2(aaa): 9 #驗證代碼 10 #驗證代碼 11 print('我是F2業務') 12 if aaa == 'f2': 13 return 'ok' LowB

?

這家伙呢在每個功能前面加入了驗證代碼,然后過了兩天Low B也被開除了

最后老大把工作交給了Low C

Low C呢總結了兩個Low的教訓他是這么干的

1 #驗證函數 2 def verify(): 3 # 驗證1 4 # 驗證2 5 # 驗證3 6 pass 7 8 def f1(aaa): 9 verify(): 10 print('我是F1業務') 11 if aaa == 'f1': 12 return 'ok' 13 14 def f2(aaa): 15 verify(): 16 print('我是F2業務') 17 if aaa == 'f2': 18 return 'ok' Lowc

?

他呢把驗證功能的,寫成了一個函數然后,每個業務模塊來去調用 老大看見了LowC的實現方式,嘴角露出了一絲微笑,并且與LowC聊了個天 ? 老大說:

寫代碼要遵循開發封閉原則,雖然在這個原則是用的面向對象開發,但是也適用于函數式編程,簡單來說,它規定已經實現的功能代碼不允許被修改,但可以被擴展,即:

  • 封閉:已實現的功能代碼塊
  • 開放:對擴展開發

如果將開放封閉原則應用在上述需求中,那么就不允許在函數 f1 、f2的內部進行修改代碼,老板就給了Low C一個實現方案:

裝飾器(單層裝飾器)

1 def out(main): 2 def wra(): 3 # 驗證1 4 # 驗證2 5 # 驗證3 6 return xxx 7 return wra 8 9 @out 10 def f1(aaa): 11 print('我是F1業務') 12 if aaa == 'f1': 13 return 'ok' 14 15 @out 16 def f2(aaa): 17 print('我是F2業務') 18 if aaa == 'f2': 19 return 'ok' 單層裝飾器

?

二、好,故事(這個故事是盜取銀角大王的)到此結束我們開始來看上面的代碼

(1)首先我們要知道當函數不加括號我們的函數是不被執行的,它會返回這個函數的內存地址 1 def aaa(): 2 print("ok") 3 4 print(aaa) 5 6 <function aaa at 0x0000000000B6AC80> 函數內存地址

(2)然后我們來解釋一下@out

@out就等于f1 = out(f1)

什么意思呢@out是python語法中的一個簡寫,他的用處就是針對裝飾器來去做的,我們看下面的例子,將@out替換成

f1 = out(f1) 1 def out(main): 2 def wra(aaa): 3 print('我進來了') 4 ccc = main(aaa) 5 return ccc 6 return wra 7 8 def f1(aaa): 9 print('我是F1業務') 10 if aaa == 'f1': 11 return 'ok' 12 13 f1 = out(f1) 14 15 s1 = 'f1' 16 17 ff1 = f1(s1) 18 print(ff1) 轉換后 (3)我們來解釋下out函數,對于out來說他首先接收一個值,從上面可以看出他接收的值是f1,f2的內存地址,然后return返回函數wra,注意的是f1 = out(f1),沒加括號所以都沒執行,返回wra的時候也沒加括號所以也沒執行,那么到了這里這個函數就先暫停我們結合者調用來看下面的圖: 第一步:請務必分開wra不等于f1而是main等于f1!!下面的f1就等于wra的意思是執行f1函數就等于執行wra函數 第二步: 最后呢我們通過python語法塘,將f1 = out(f1) 變成@out就變成了之前我們看到的代碼 1 def out(main): 2 def wra(aaa): 3 print('我進來了') 4 ccc = main(aaa) 5 return ccc 6 return wra 7 8 @out 9 def f1(aaa): 10 print('我是F1業務') 11 if aaa == 'f1': 12 return 'ok' 13 14 15 s1 = 'f1' 16 ff1 = f1(s1) 17 print(ff1) 完整單層裝飾器 友情提示: 在此請將之前的練習一下并且熟知其中的原理再進行下面的學習,大神除外 (4)裝飾器裝上含有參數的函數,有同學可能測試了一下說,我把函數f1的參數變成了多個,裝飾器就報錯了,那是怎么回事呢,原因很簡單,因為wra首先他只能接收一個參數,并且ccc = main(aaa)也只接收了一個參數 1 def out(main): 2 def wra(aaa): 3 print('我進來了') 4 ccc = main(aaa) 5 return ccc 6 return wra 單參數

?

既然知道了原因那么我們就給他改改數碼寶貝超進化…:

1 def out(main): #這里就不多解釋了跟上面一樣 2 def wra(*aaa,**aa): #這里呢變成了啥是不是可以接收各種的參數了 3 print('我進來了') 4 ccc = main(*aaa,**aa) #這里呢也可以給f1各種參數 5 return ccc 6 return wra 7 8 @out 9 def f1(*af1): 10 print('我是F1業務') 11 print(af1[0]) #給大家測試用的 12 print(af1[1]) 13 if af1[0] == 'f1': 14 return 'ok' 15 16 s1 = 'f1' 17 ff1 = f1(s1,'我是參數2') #傳入了兩個值s1和我是參數2' 18 print(ff1) #運行一下看看吧呵呵 裝飾參數函數的裝飾器

三、裝飾器的終極進化(多層裝飾器)邏輯比較繞

有一天,變態的老大又找到了Low C說你的裝飾器練習的咋樣了,Low C說:經過老大的調教,我已經練習的差不多了,這個時候老大陰陰的呵呵一笑,好,這樣我呢又有個需求要你給我改改,我現在呢想在驗證之后呢添加一個歡迎功能,這個功能呢,我們業務線的功能想要添加就添加先要不添加就不添加,要記住封閉原則哦0.0……….

第二天Low C找到了老大說,大哥啊您晚上還是來我家教教我吧,真心的不知道啊0.0,,,于是老大就去了Low C的家里經過一場風云(此次省略一萬個字)0.0老大提供了另外的參考代碼:

1 def ds(): 2 print('ok我是歡迎信息1') 3 4 def ss(): 5 print('ok我是歡迎信息2') 6 7 8 def fill(*ill): 9 def out(main): 10 def wra(*waa,**wad): 11 ill[0]() 12 ill[1]() 13 ccc = main(waa[0]) 14 return ccc 15 return wra 16 return out 17 18 19 @fill(ds,ss) 20 def f1(aaa): 21 print('我是F1業務') 22 if aaa == 'f1': 23 return 'ok' 24 25 26 c1 = f1('f1') 27 print(c1) 老大的代碼

?

哈哈看不懂了吧(大神除外)來吧我們分開來看就知道了 第一步:還是先解釋一下裝飾器fill請看圖片,有一句話要牢記這個裝飾器我就把它理解成調用,也就是把需要用的函數傳入到裝飾器做值,從而調用值來執行函數 ? 第二步:
?

好到了這里大家應該明白了吧,不明白的留言,講錯了的請指教謝謝O(∩_∩)O~~,那么有的小伙伴要問了,這尼瑪不對啊,為毛我把@fill(ds,ss)變成@fill(ss)就報錯了呢?

我們分析一下問題,主要的原因呢就是def wra函數下面執行了 ill[1]報錯了,因為這里*ill只有一個參數那么避免呢,看我的終極大招:

1 def ds(): 2 print('ok我是歡迎信息1') 3 def ss(): 4 print('ok我是歡迎信息2') 5 6 def fill(*ill): 7 def out(main): 8 def wra(*waa,**wad):#這里加個判斷不就完了么 O(∩_∩)O哈哈~ 9 if len(ill) != '0': 10 for i in range(0,len(ill)): 11 ill[i]() 12 ccc = main(waa[0]) 13 return ccc 14 return wra 15 return out 16 17 @fill(ss,ds) 18 def f1(aaa): 19 print('我是F1業務') 20 if aaa == 'f1': 21 return 'ok' 22 23 @fill() #你看這里沒參數吧 24 def f2(aaa): 25 print('我是F2業務') 26 if aaa == 'f2': 27 return 'ok' 28 29 c1 = f1('f1') 30 print(c1) 31 c2 = f2('f2') 32 print(c2) 終極大招-多層裝飾器

?

#運行下試試吧 等等!最后老大和Low C成為了…此處省略一百萬個字

作者:北京小遠
出處:http://www.cnblogs.com/bj-xy/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

轉載于:https://www.cnblogs.com/bj-xy/p/5185306.html

總結

以上是生活随笔為你收集整理的Python成长之路_装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人xxx视频| 一本色道无码道dvd在线观看 | 亚洲免费自拍 | mm1313亚洲国产精品无码试看 | 日本毛片网站 | 韩日欧美| 久久少妇网| 日本一区二区三区在线观看 | 天天射一射 | 成人激情视频在线 | 一区二区三区久久久 | 国产精品久久久久久久久久辛辛 | 一级黄色大片视频 | 亚洲αv | 天天射天天 | 色先锋影院 | 亚洲成人系列 | 在线视频a| 成人激情免费 | av日韩av| 无套日出白浆 | 殴美一级黄色片 | 国产视频在线播放 | 亚洲视频中文字幕在线观看 | 久热伊人 | 好吊妞视频这里只有精品 | 男女插孔视频 | 91视频www| 国产福利网 | 99热91 | 国产精品无码中文 | 嫩草影院懂你的影院 | 国产亚洲欧洲 | 精品123区| 高跟鞋和丝袜猛烈xxxxxx | 黄色污在线观看 | av直播在线观看 | 国产3p露脸普通话对白 | 免费成人深夜夜国外 | 97av在线视频 | 国产中文字幕在线 | 老外毛片 | 8090av| 成人免费av在线 | 日韩欧美性视频 | 色爽交 | 花房姑娘免费全集 | 免费视频一二三区 | 性久久久久久久久久 | 清纯唯美第一页 | 日本在线视频免费观看 | 闺蜜张开腿让我爽了一夜 | 国产深夜福利 | 欧美九九视频 | 亚洲播放器 | 日韩在线观看不卡 | 精品一区二区三区久久 | 日韩一区在线看 | 成年免费视频黄网站在线观看 | 欧美男人的天堂 | a级欧美| 五月婷婷激情视频 | 岛国精品在线 | 精品一区二区在线播放 | 天堂av一区二区 | 欧美一区二区不卡视频 | 久精品在线观看 | 亚洲熟妇中文字幕五十中出 | 亚洲一区免费在线观看 | 风韵少妇性饥渴推油按摩视频 | 美女色网站 | 青草视屏| av网在线| 欧美另类z0zx974 | 亚洲bb | 91在线精品播放 | 91大神福利视频 | 国产农村妇女aaaaa视频 | 国产盗摄精品一区二区酒店 | 国产原创在线 | 最好看的mv中文字幕国语电影 | 最新版天堂资源在线 | 久热中文字幕 | 亚洲黄a | 在线观看免费av片 | 熟妇人妻中文av无码 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产精品永久久久久久久久久 | 先锋资源av在线 | 欧美精品一区二区三区四区 | 一区二区在线观看视频 | 黄色网址你懂的 | 久久精品国产99 | 亚洲色图首页 | 超碰人人擦 | 一个人看的www片免费高清中文 | 欧美 国产 综合 | 国产swag在线 | xxx69美国|