python裝飾器的使用演示

2021-10-01 09:20:35 字數 4501 閱讀 5370

假如有乙個函式,我需要給這個函式新增新功能,但是不改變這個函式的呼叫方式,那麼就可以用到了裝飾器

原函式

# _*_coding:utf8_*_

import time

deffunc1()

: time.sleep(1)

print

('這是函式1'

)func1(

)

輸出結果為

c:\python\python36\python.exe d:

/python/demo/裝飾器.py

這是函式1

如果我需要給這個函式多新增乙個列印內容,那麼我就可用這樣做

import time

deffunc1()

: time.sleep(1)

print

('這是函式1'

)def

func2

(f):

print

('這是函式2'

)return f

func1 = func2(func1)

#建立乙個新的func1 這個和前面的func1函式是不同的東西。是乙個新的

func1(

)# 實現呼叫

輸出結果為

c:\python\python36\python.exe d:

/python/demo/裝飾器.py

這是函式2

這是函式1

這樣就實現了簡單的裝飾器的功能,具體實現原理就是,建立乙個新的函式func2,然後把func1的命名空間當做引數傳給func2,然後返回func1,沒有加()也就是沒有實現呼叫,當後面執行func1(),就實現了呼叫了。

沒有改變func1的呼叫方式,但是執行func1出現的結果多了內容,這就實現了乙個簡單的裝飾器。

python中,func1 = func2(func1)可用用@func2代替,具體優化**如下

# _*_coding:utf8_*_

import time

deffunc2

(f):

print

('這是函式2'

)return f

@func2

deffunc1()

: time.sleep(1)

print

('這是函式1'

)func1(

)

上面是最簡單的只加乙個功能輸出,下面這個加乙個函式執行時間

# _*_coding:utf8_*_

import time

deffunc2

(f):

print

('這是函式2'

)def

inner()

: start = time.time(

) f(

) end = time.time(

)print

(end-start)

return inner

@func2

deffunc1()

: time.sleep(1)

print

('這是函式1'

)func1(

)

執行結果為:

c:\python\python36\python.exe d:

/python/demo/裝飾器.py

這是函式2

這是函式1

1.000349521636963

上面的func1沒有返回值,如果func1加上返回值,那麼**就需要改造了

# _*_coding:utf8_*_

import time

deffunc2

(f):

print

('這是函式2'

)def

inner()

: start = time.time(

) result = f(

) end = time.time(

)print

(end-start)

return result

return inner

@func2

deffunc1()

: time.sleep(1)

print

('這是函式1'

)return

'這是函式1的返回值'

print

(func1(

))

結果為

c:\python\python36\python.exe d:

/python/demo/裝飾器.py

這是函式2

這是函式1

1.0005292892456055

這是函式1的返回值

上面實現的過程為在inner函式中,增加乙個返回值,這個inner的返回結果,就是第乙個func1的返回結果

上面的**func1沒有傳遞引數的功能,如果需要加上引數傳遞呢?

**可用這樣改寫

# _*_coding:utf8_*_

import time

deffunc2

(f):

print

('這是函式2'

)def

inner

(a):

# 這裡的a接收func1中的a的引數

start = time.time(

) result = f(a)

#這裡的a執行

end = time.time(

)print

(end-start)

return result

return inner

@func2

deffunc1

(a):

time.sleep(1)

print

('這是函式1'

)print

(a)return

'這是函式1的返回值'

print

(func1(

1111111

))

執行結果為:

c:\python\python36\python.exe d:

/python/demo/裝飾器.py

這是函式2

這是函式1

1111111

1.000321626663208

這是函式1的返回值

func1傳遞乙個11111111,之後列印11111111

假如func2需要裝飾func1func3,但是func1傳遞乙個引數,func3傳遞二個引數,那麼func2只需要把接收引數修改為*args,**kwargs即可

# _*_coding:utf8_*_

import time

deffunc2

(f):

print

('這是函式2'

)def

inner

(*args,

**kwargs)

: start = time.time(

) result = f(

*args,

**kwargs)

end = time.time(

)print

(end-start)

return result

return inner

@func2

deffunc1

(a):

time.sleep(1)

print

('這是函式1'

)print

(a)return

'這是函式1的返回值'

@func2

deffunc3

(a,b)

: time.sleep(1)

print

('這是函式3'

)print

(a)return

'這是函式3的返回值'

python 裝飾器的使用

使用裝飾器將函式作為引數,最後再返回乙個引數,簡單來說就是在不修改原函式的 上對原函式新增新的功能。1 在原函式中新增乙個裝飾器 原函式 def sayhello print hello,world sayhello 新增裝飾器後 import functools def decorator fun...

python裝飾器的使用

在class內部,可以有屬性和方法,而外部 可以通過直接呼叫例項變數的方法來運算元據,這樣,就隱藏了內部的複雜邏輯。但是,從前面student類的定義來看,外部 還是可以自由地修改乙個例項的name score屬性 如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線 在python中,例...

Python裝飾器的使用

本文介紹的是python裝飾器 的使用,分三部分記錄裝飾器,旨在為之後複習保留學習筆記。python裝飾器在沒有改變原始函式呼叫方式的同時,在原始函式的前後增加功能,滿足開放封閉原則。目錄 1.裝飾器的固定模板 2.帶引數的裝飾器模板 3.多個裝飾器函式裝飾乙個函式 裝飾器的固定模板 def inn...