二 裝飾器高階

2021-09-09 07:27:51 字數 3807 閱讀 2296

1、帶引數的裝飾器

import time

flage=

false

deftime_out

(flage)

:def

timer

(fun)

:def

inner

(*args,

**kwargs)

:if flage:

start=time.time(

) ret=fun(

*args,

**kwargs)

end=time.time(

)print

(end-start)

return ret

else

: ret = fun(

*args,

**kwargs)

return ret

return inner

return timer

@time_out(flage)

#等於執行time_out(flage)返回timer再執行@timer(@加timer)

defhaha()

: time.sleep(

0.01

)print

('哈哈哈'

)@time_out(flage)

#等於執行time_out(flage)返回timer再執行@timer(@加timer)

defnainiu()

: time.sleep(

0.01

)print

('奶牛'

)nainiu(

)haha(

)

2、多個裝飾器裝飾乙個函式

多個裝飾器裝飾乙個函式執行順序:先執行距離函式最近的裝飾器

def(func)

:def

inner1()

:print()

ret = func(

)print()

return ret

return inner1

def(func)

:def

inner2()

:print()

ret = func(

)print()

return ret

return inner2

def(func)

:def

inner3()

:print()

ret = func(

)print()

return ret

return inner3

deff()

:print

('in f'

)return

'哈哈哈'

print

(f()

)#記錄使用者的登入情況

#計算這個函式的執行時間

3、萬能裝飾器wraps

from functools 

def(func)

:#func = holiday

@functools .wraps(func)

#增加這個之後下面呼叫展示的holiday.__name__為holiday,否則為inner

definner

(*args,

**kwargs)

:print

('在被裝飾的函式執行之前做的事'

) ret = func(

*args,

**kwargs)

print

('在被裝飾的函式執行之後做的事'

)return ret

return inner

defholiday

(day)

:'''這是乙個放假通知'''

print

('全體放假%s天'

%day)

return

'好開心'

print

(holiday.__name__)

ret = holiday(3)

#inner

print

(ret)

from functools 

def(func)

:#func = holiday

@functools .wraps(func)

#增加這個之後下面呼叫展示的holiday.__name__為holiday,否則為inner

definner

(*args,

**kwargs)

:print

('在被裝飾的函式執行之前做的事情'

) ret = func(

*args,

**kwargs)

print

('在被裝飾的函式執行之後做的事情'

)return ret

return inner

defholiday

(day)

:'''這是乙個放假通知'''

print

('全體放假%s天'

%day)

return

'好開心'

print

(holiday.__name__)

ret = holiday(3)

#inner

print

(ret)

接受帶引數和不帶引數

import time,functools

deflog

(fs):if

isinstance

(fs,

str)

:#如果是字串

deff

(func)

: @functools.wraps(func)

deffn

(*args,

**kwargs)

:print

('call %s'

%func.__name__,fs)

result=func(

*args,

**kwargs)

return result

return fn

return f

else

:#否則 fs就是函式的指向

@functools.wraps(fs)

deffn

(*args,

**kwargs)

:print

('call %s'

%fs.__name__)

result=fs(

*args,

**kwargs)

return result

return fn

@log(

'excute'

)defs2(

):print

(time.strftime(

'%y-%m-%d %h:%m:%d'

,time.localtime())

)return

'我是s2函式'

@log

defs1()

:print

(time.strftime(

'%y-%m-%d %h:%m:%d'

,time.localtime())

)return

'我是s1函式'

print

(s1())

print

(s2(

))

裝飾器高階

有參 在標準裝飾器的外層,套了一層就需要額外的呼叫一程 語法糖 裝飾器 引數 帶參修飾器 while true def count a def func f def fool args,kwargs if a 1 print 這是第乙個裝飾的函式qq f args,kwargs if a 2 f a...

python高階裝飾器 Python裝飾器高階

對帶引數的函式進行裝飾 對帶引數的函式進行裝飾,內嵌包裝函式的形參和返回值與原函式相同,裝飾函式返回內嵌包裝函式物件 def deco func def deco a,b print before myfunc called.ret func a,b print after myfunc calle...

python高階 裝飾器

1.1 裝飾器 裝飾器的作用 在不改變原函式的情況下給函式增加功能 裝飾器由閉包和語法糖組成 1.2 閉包 閉包特點 外部函式巢狀內部函式 內部函式可以訪問並且儲存外部函式的變數 外部函式返回內部函式的引用 有以上三個特點的函式就稱為閉包 閉包的例子 def func1 a def func2 b ...