對python裝飾器幾種常見方式的使用與理解

2021-10-09 04:01:51 字數 2735 閱讀 8736

1、裝飾器的理論:

(1)裝飾器實際上就是乙個函式

(2)有2個特別之處,引數是乙個函式。返回值是乙個引數

2、裝飾器的簡單理解:

實際上就是為了給乙個程式新增功能,但是該程式已經上線或者已被使用,那麼就不能大批量的修改原始碼,這樣不現實,因此就產生了裝飾器。

注意點:

(1)不能修改被裝飾的函式的源**

(2)不能修改被裝飾的函式的呼叫方式

3、裝飾器的組成方式:

函式+實參高階函式+返回值高階函式+巢狀函式+語法糖 = 裝飾器

有關高階函式的理解:

(1)把乙個函式名當作實參傳給另外乙個函式(」實參高階函式「)

(2)返回值中包含函式名(」返回值高階函式「)

巢狀函式的理解:

巢狀函式指的是在函式內部定義乙個函式,而不是呼叫。
語法糖:

寫法:@xx  ,一般寫在函式的上方
4、真正裝飾器的開始之處:

裝飾器在裝飾時,需要在每個函式前面加上@***

(1) 裝飾無參函式,示例**如下:

#裝飾器裝飾的函式無引數

deftimer

(func)

:#func其實指的就是test

defdeco()

: start = time.time(

) func(

)#這裡其實是對test的呼叫

stop = time.time(

)print

(stop-start)

return deco

@timer #test函式使用裝飾器

deftest()

: time.sleep(2)

print

("test is running"

)test(

)列印結果:

test is running

2.003510952

(2)裝飾有參函式,示例**如下:

'''

'''#裝飾器裝飾的函式有引數

deftimer

(func)

:def

deco

(*args,

**kwargs)

:#新增可變引數*args和**kwargs

start = time.time(

) func(

*args,

**kwargs)

#這裡也是一樣,新增可變引數*args和**kwargs

stop = time.time(

)print

(stop-start)

return deco

@timer

deftest

(value)

:#test函式有個引數value,正因為裝飾器timer裝飾的函式test有引數value,因此在timer中的有了可變引數

time.sleep(2)

print

("test is running %s"

%value)

test(

"22"

)列印結果:

test is running 22

2.00424408913

(3)帶引數的裝飾器,示例**如下:

#裝飾器帶引數

deftimer

(parameter)

:def

(func)

:def

(*wargs,

**kwargs)

:if parameter ==

"task1"

: start = time.time(

) func(

*wargs,

**kwargs)

stop = time.time(

)print

("the task1 is run:"

,stop-start)

elif parameter ==

"task2"

: func(

*wargs,

**kwargs)

print

("the task2 is run:"

)@timer(parameter =

"task1"

)def

task1()

: time.sleep(2)

print

"in the task1"

@timer(parameter =

"task2"

)def

task2()

: time.sleep(2)

print

"in the task2"

task1(

)task2(

)列印結果:

in the task1(

'the task1 is run:'

,2.002906084060669

)in the task2the task2 is run:

跨域幾種常見方案

一 jsonp 客戶端 伺服器端 echo request callback json encode array res 1111 msg 請求成功 二 jquery 客戶端 服務端 echo request callback json encode array res 1111 msg 請求成功 ...

陣列 的幾種常見方法

unshift 新增,將要給定的數值新增到陣列的開頭 var arr 西瓜 蘋果 雪梨 香蕉 arr.unshift 桃子 哈密瓜 桃子 哈密瓜 西瓜 蘋果 雪梨 香蕉 console.log arr shift 方法 從陣列中刪除第乙個元素,並返回該元素的值。此方法更改陣列的長度。從陣列中刪除的元...

隱藏div的幾種常見方法

1.display none 2.visibility hidden 3.background color transparent 或者設成與背景一樣的顏色即可 4.opacity來設定不透明級別,注意相容性filter 5.給div乙個margin負值,這個負值恰好等於div自身的高度或寬度 6....