裝飾器的幾種形式 萬能裝飾器

2021-09-25 21:04:37 字數 3682 閱讀 7595

1.無參無返回值

def

setfunc

(func)

:def()

:print

('start'

) func(

)print

('end'

)@setfunc

defshow()

:print

('show'

)show(

)#在不改變原函式呼叫釋放下 新增了功能

#start

show

end

2.無參有返回值

def

setfunc

(func)

:def()

:print

('start'

) func(

)# 若改為 return func() 則輸出 start show 因為遇到return終止end不輸出

print

('end'

)@setfunc

defshow()

:return

'show'

print

(show())

# 返回值 show 在 裝飾器中 沒有輸出

start

endnone

3.有參無返回值

def

setfunc

(func)

:def

(s):

print

('start'

) func(s)

print

('end'

)@setfunc

defshow

(s):

print

('hello %s'

%s)show(

'zucc'

)start

hello zucc

end

4.有參有返回值

def

setfunc

(func)

:def

(x, y)

:print

('start'

)return func(x, y)

#return後終止

print

('end'

)#end 不會輸出

@setfunc

defmyadd

(x, y)

:return x+y

print

(myadd(1,

2))start

3

根據被裝飾函式定義的不同,分出了四種形式。

能不能實現一種,適用於任何形式函式定義的裝飾器?

通過可變引數(*args/**kwargs)來接收不同的引數型別

def

setfunc

(func)

:def

(*args,

**kwargs)

:print()

return func(

*args,

**kwargs)

@setfunc

deffunc

(name, age, job =

'it'):

print

(name, age,

'student'

)func(

'tom',18

,)@setfunc

deffuncc

(x, y)

:return x*y

print

(funcc(3,

4))@setfunc

defdemo

(a, b,

*c,**d)

:print

((a, b)

)print

(c)print

(d)demo(

'zu'

,'cc'

,1999,1

,1,school =

'zucc'

)tom 18 student12(

'zu'

,'cc')(

1999,1

,1)

乙個函式在使用時,通過乙個裝飾器來拓展,可用多個裝飾器來裝飾

#裝飾器1

defsetfunc1

(func)

:def

(*args,

**kwargs)

:print

(.center(40,

'*')

) func(

*args,

**kwargs)

print

(.center(40,

'*')

)#裝飾器2

defsetfunc2

(func)

:def

(*args,

**kwargs)

:print

(.center(40,

'*')

) func(

*args,

**kwargs)

print

(.center(40,

'*')

)@setfunc1

@setfunc2

defshow

(*args,

**kwargs)

:print

('show run.'

.center(40,

'*')

)show(

)# f(g(f)) 巢狀先裝飾最近的 2 再裝飾1

****

****

*******

****

*******

****

****

****

***show run.

****

****

****

****

****

****

****

****

****

****

****

****

總結:

函式可以像普通變數一樣,作為函式的引數或者返回值進行傳遞。

函式的內部可以定義另外乙個函式。目的,隱藏函式功能的實現。

閉包實際上也是函式定義的一種形式。

閉包定義的規則,再外部函式內定義乙個內部函式,內部函式使用外部函式的變數,並返回內部函式的引用。

python中,裝飾器就是用閉包來實現的。

裝飾器的作用,不改變現有函式的基礎上,為函式增加功能。

裝飾器的使用,通過@裝飾器函式名的形式來給已有函式進行裝飾,新增功能。

裝飾器四種形式,根據引數的不同以及返回值的不同。

萬能裝飾器,通過可變引數(*args/**kwargs)來實現。

乙個裝飾器可以為多個函式提供裝飾功能。

乙個函式也可以被多個裝飾器所裝飾。

通過類實現裝飾器,重寫__init____call__函式。

類裝飾器再裝飾函式後,原來的引用不再是函式,兒視裝飾類的物件。

萬能裝飾器

萬能裝飾器 裝飾前的test 最先定義的test 是由func指向 裝飾後的test其實就是call fun 裝飾器在道德上不會去更改原先函式的返回值,不會去更改原先的引數 call fun,func,test這三個引數一般保持一致 def set fun func def call fun arg...

裝飾器 萬能傳參

案例 一 環境 以上為線上 需要新增1個統計執行時間的功能。線上 如下 1 usr bin env python2 coding utf8 3 author dong ye45 import time67 8def test1 9 time.sleep 3 10print in the test1 ...

裝飾器的幾種形式

1.無引數無返回值 def setfunc func def print start func print end setfunc setfunc show defshow print show show start show end2.無參有返回值 def setfunc func def pri...