裝飾器 裝飾你的夢

2022-09-02 04:21:13 字數 2914 閱讀 9798

一、不用裝飾器

為函式增加計時

def deco(func):

start_time = time.time()

func()

end_time = time.time()

print(end_time - start_time)

def myfunc():

time.sleep(0.6)

deco(myfunc)

二、封裝一層
def deco(func):

start_time = time.time()

func()

end_time = time.time()

print(end_time - start_time)

def myfunc():

time.sleep(0.6)

myfunc = deco(myfunc)

myfunc()

三、裝飾器語法糖
def deco(func):

start_time = time.time()

func()

end_time = time.time()

print(end_time - start_time)

@deco

def myfunc():

time.sleep(0.6)

myfunc()

使用了」@」語法糖後,我們就不需要額外**來給」myfunc」重新賦值了,其實」@deco」的本質就是」myfunc=deco(myfunc)」,當認清了這一點後,後面看帶引數的裝飾器就簡單了。
四、被裝飾的函式帶引數
def deco(func):

start_time = time.time()

func(a, b)

end_time = time.time()

print(end_time - start_time)

@deco

def myfunc(a, b):

print("a + b =", a+b)

time.sleep(0.6)

myfunc(10, 9)

五、被裝飾的函式帶引數

這裡還有乙個問題,如果多個函式擁有不同的引數形式,怎麼共用同樣的裝飾器?在python中,函式可以支援(*args, **kwargs)可變引數,所以裝飾器可以通過可變引數形式來實現內嵌函式的簽名。

def deco(func):

start_time = time.time()

func(*args, **kwargs)

end_time = time.time()

print(end_time - start_time)

@deco

def myfunc(a, b):

print("a + b =", a+b)

time.sleep(0.6)

myfunc(10, 9)

使用位置和關鍵字引數可以相容各種函式,裝飾器就成了通用的了。

使用了*args位置引數和**kwargs關鍵字引數,不明白先補下知識點。

六、被裝飾函式有返回值

def deco(func):

start_time = time.time()

res = func(*args, **kwargs)

end_time = time.time()

print(end_time - start_time)

return res

@deco

def myfunc(a, b):

time.sleep(0.6)

return a+b

res = myfunc(10, 9)

print(res)

七、裝飾器也想帶引數

功能:裝飾器裡的計時功能可以關閉

def deco(arg=true):

if arg:

def _deco(func):

start_time = time.time()

func(*args, **kwargs)

end_time = time.time()

print(end_time - start_time)

else:

def _deco(func):

return func

return _deco

@deco(arg=false) # 這裡注意下, @deco(arg=false)先執行,就變形成了@_deco(func)

def myfunc(a, b):

print("a + b =", a+b)

time.sleep(0.6)

myfunc(10, 9)

又封裝一層,好多層!

八、多個裝飾器

離函式近的優先執行

def deco_1(func):

start_time = time.time()

func(*args, **kwargs)

end_time = time.time()

print(end_time - start_time)

def deco_2(func):

func(*args, **kwargs)

print("from deco_2:")

@deco_1

@deco_2

def myfunc(a, b):

print("a + b =", a+b)

time.sleep(0.6)

myfunc(10, 9)

參考:

裝飾器之類裝飾器

外部的方法至今都玩過了,現在來思索一下的方法這麼裝飾 類方法修飾器 類的方法唯一的特殊點在於,self內部是可以呼叫的,但是在外部卻是隱藏的,那這個怎麼搞 為求穩妥,先定參修飾乙個 def godme fun def godme self,message print before fun self,...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...

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

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