裝飾器函式

2022-08-15 06:57:11 字數 4149 閱讀 3398

裝飾器的模板:

import time

deffunc1():

start =tiime.time()

print('

in func1')

end =time.time()

print(end-start)

func1()

來公司半年,寫了2000+函式,挨個改一遍,1個禮拜過去了,等領導審核完,再挨個給刪了。。。又1個禮拜過去了。。。這是不是很鬧心?

import

time

deftimer(func):

start =time.time()

func()

print(time.time() -start)

deffunc1():

print('

in func1')

deffunc2():

print('

in func2')

timer(func1)

timer(func2)

這樣看起來是不是簡單多啦?不管我們寫了多少個函式都可以呼叫這個計時函式來計算函式的執行時間了。。。儘管現在修改成本已經變得很小很小了,但是對於同事來說還是改變了這個函式的呼叫方式,假如某同事因為相信你,在他的**裡用你的方法用了2w多次,那他修改完**你們友誼的小船也就徹底地翻了。

你要做的就是,讓你的同事依然呼叫func1,但是能實現呼叫timer方法的效果。

import

time

deftimer(func):

start =time.time()

func()

end =time.time()

prinet(end-start)

deffunc1():

print('

in func1')

func1 =timer

func1

非常可惜,上面這段**是會報錯的,因為timer方法需要傳遞乙個func引數,我們不能在賦值的時候傳參,因為只要執行func1 = timer(func1),timer方法就直接執行了,下面的那句func1根本就沒有意義。到這裡,我們的思路好像陷入了僵局。。。

裝飾器的形成過程

import

time

deffunc1():

print('

in func1')

deftimer(func):

definner():

start =time.time()

func()

end =time.time()

print(end -start)

func1 =timer(func1)

func1()

語法糖:

裝飾器的本質:乙個閉包函式

裝飾器的功能:在不修改原函式及其呼叫方式的情況下對原函式功能進行擴充套件

import

time

deftimer(func):

definner():

start =time.time()

func()

end =time.time()

print(end -start)

@timer

deffunc1():

print('

in func1')

func1()

帶參裝飾器:

import

time

deftimer(func):

definner(a):

start =time.time()

print

(a) end =time.time()

return

inner

@timer

deffunc1(a):

print

(a)func1(1)

import

time

#裝飾器

#def timer(f1):

## def inner():

## start_time = time.time()

## f1()

## end_time = time.time()

## print('此函式的執行效率%s' %(end_time-start_time))

## return inner##

## @timer #func1 = timer(func1)

## def func1():

## print('晚上回去吃燒烤')

## time.sleep(0.3)

## func1()

#完整裝飾器##

def inner(*args,**kwargs):

#ret=f1(*args,**kwargs)

#return ret

#return f1##

def func1():

#print(222)

#print(333)

#print(func1())

#import time

#def timer(func):

#def inner(a):

#start = time.time()

#print(a)

#end = time.time()

#return inner

#@timer

#def func1(a):

#print(a)

#func1(1)

deftimer(func):

def inner(*args,**kwargs):

start =time.time()

re = func(*args,**kwargs)

end =time.time()

print(end -start)

return

re

return

inner

deffunc1(a,b):

print('

in func1')

deffunc2(a):

print('

in func2 and get a:%s

'%(a))

return

'fun2 over

'func1(

'aaa

','aaaaaa')

func2 = func2('

bbbbbbb')

print(func2)

帶返回值的--裝飾器

import

time

deftimer(func):

def inner(*args,**kwargs):

start =time.time()

re = func(*args,**kwargs)

print(time.time() -start)

return

re

return

inner

@timer

#==> func2 = timer(func2)

deffunc2(a):

print('

in func2 and get a:%s

'%(a))

return

'fun2 over

'func2(

'bbbbbbb')

print(func2('

aaaaaa

'))

from functools import

wraps

defdeco(func):

@wraps(func)

#加在最內層函式正上方

return func(*args,**kwargs)

return

@deco

defindex():

'''哈哈哈哈

'''print('

from index')

print(index.__doc__

)print(index.__name__)

函式裝飾器 類裝飾器

一 函式裝飾函式 defwrapfun func definner a,b print function name func.name r func a,b return r return inner wrapfun defmyadd a,b return a b print myadd 2,3 二...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...