自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python裝飾器演化過程

開發(fā) 前端
Python 的裝飾器可能是很多初學(xué)者難以搞懂的知識(shí)點(diǎn)之一,今天以另一個(gè)角度再次講解裝飾器。

Python 的裝飾器可能是很多初學(xué)者難以搞懂的知識(shí)點(diǎn)之一,其實(shí)以前我也有講解這方面的知識(shí),不過那是在 pandas 專欄里面。

今天以另一個(gè)角度再次講解裝飾器。

場(chǎng)景

先看看一開始的代碼:

  • 行2:這是今天我們需要實(shí)現(xiàn)的裝飾器函數(shù)
  • 行5:裝飾器函數(shù)可以作用到任意其他的函數(shù)上
  • 行10:每當(dāng)調(diào)用被裝飾的函數(shù),就會(huì)在執(zhí)行函數(shù)之前打印一句內(nèi)容,運(yùn)行結(jié)束后,打印結(jié)果內(nèi)容

比如 行10 執(zhí)行后,后臺(tái)會(huì)輸出。

接下來,我們一步步實(shí)現(xiàn) faker 函數(shù)。

函數(shù)名字是變量名而已

前面定義的函數(shù) mysum ,只不過是一個(gè)普通變量。就像你用一個(gè)變量保存了一個(gè)字符串一樣:

mystr = 'xxxx'

只不過函數(shù)是表達(dá)一段代碼(邏輯)。怎么證明?

python 中可以用 del 關(guān)鍵字刪除一個(gè)變量:

行12 會(huì)報(bào)錯(cuò):

NameError: name 'mysum' is not defined

不怕,可以先用另一個(gè)變量"接住"函數(shù)對(duì)象:

行8:注意了,mysum 后面沒有帶括號(hào)。因?yàn)楹瘮?shù)名 + 括號(hào),才是執(zhí)行函數(shù)體內(nèi)的代碼。只是寫函數(shù)名字,實(shí)際上并沒有執(zhí)行函數(shù)。

好了,到此為止,下面是初始版本的 faker:

非常簡(jiǎn)單了,應(yīng)該大家都能理解。不過現(xiàn)在 faker 一點(diǎn)都不像 mysum 呀!調(diào)用是這樣子的:

而且參數(shù) 1 和 2 還固定寫在了 faker 里面。

那么,先解決參數(shù)的問題吧,非常簡(jiǎn)單,設(shè)置兩個(gè)參數(shù)就可以:

用上一開始的"變量假冒法" :

但 faker 函數(shù)里面仍然有一個(gè)固定的東西(行8),那個(gè) other_func 變量永遠(yuǎn)指向 mysum 函數(shù)(行4)。我們希望 faker 函數(shù)可以假冒任意的函數(shù)。

函數(shù)傳遞

我們既然學(xué)會(huì)了"變量假冒法",那么就能知道,函數(shù)對(duì)象其實(shí)與普通的數(shù)據(jù)差不多,是可以通過參數(shù)傳入另一個(gè)函數(shù)中。

  • 行6:新增一個(gè)參數(shù),讓外面把 mysum 傳進(jìn)來吧,這樣子就變動(dòng)態(tài)了
  • 行12:傳入 mysum 函數(shù)。注意,mysum 后面是沒有括號(hào),我們沒有執(zhí)行 mysum 函數(shù)本身

但是顯然,現(xiàn)在代碼報(bào)錯(cuò)了,因?yàn)?faker 函數(shù)原來的兩個(gè)變量 a 和 b 沒有了。就算把 a 和 b 加上,也不行:

我們并不是要在行12那里執(zhí)行函數(shù)。怎么辦?

other_func 參數(shù)肯定是需要的,只是直接放在 faker 不行而已。那么就多搞一個(gè)函數(shù)吧:

勝利的曙光已經(jīng)出現(xiàn)了。

上面 vs code 已經(jīng)提示出兩個(gè)錯(cuò)誤。一個(gè)個(gè)來。

第一個(gè)問題,行16,我們希望 real_faker 調(diào)用后,返回 faker 函數(shù)本身。

簡(jiǎn)單:

可以看到 行16 沒有提示錯(cuò)誤了。

第二個(gè)問題,行12,找不著變量 other_func 。

簡(jiǎn)單,在函數(shù) real_faker 中,不就有一個(gè)大大的參數(shù) other_func 。把整個(gè) faker 函數(shù)移進(jìn)去就可以:

現(xiàn)在 real_faker 就是帶有裝飾器效果。不過,可以看到,每次我們要裝飾一個(gè)函數(shù),都必須寫上 行17 的代碼。

所以,python 提供了一個(gè)簡(jiǎn)化的語法。

責(zé)任編輯:趙寧寧 來源: 數(shù)據(jù)大宇宙
相關(guān)推薦

2012-03-07 11:25:58

編程語言

2010-02-01 17:50:32

Python裝飾器

2023-02-07 07:47:52

Python裝飾器函數(shù)

2016-11-01 09:24:38

Python裝飾器

2022-09-19 23:04:08

Python裝飾器語言

2024-10-15 17:12:38

代碼父子線程開源

2021-06-01 07:19:58

Python函數(shù)裝飾器

2024-05-24 11:36:28

Python裝飾器

2023-12-13 13:28:16

裝飾器模式Python設(shè)計(jì)模式

2021-04-11 08:21:20

Python@property裝飾器

2025-01-22 15:58:46

2022-09-21 09:04:07

Python裝飾器

2024-09-12 15:32:35

裝飾器Python

2024-02-26 00:00:00

TypeScript裝飾器decorators

2021-07-27 15:58:12

Python日志代碼

2022-09-27 11:01:08

Python裝飾器

2025-01-06 15:00:00

Python裝飾器代碼

2013-05-03 14:44:12

Windows SerHyper-VVMware

2023-08-07 16:07:42

2024-05-28 00:30:00

Python裝飾器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)