函式裝飾器

2022-05-29 18:21:10 字數 2314 閱讀 8555

不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能。

import time

def outer(f): #裝飾器函式

def inner(*args,**kwargs):

start = time.time() # 要裝飾的部分

ret = f(*args,**kwargs) #f(1,2) #被裝飾的函式

end = time.time() # 要裝飾的部分

print(end - start)

return ret+" 元旦好"

return inner

@outer #語法糖 @裝飾器函式名 func=outer(func)

def func(a,b): #被裝飾的函式

time.sleep(0.01)

return '新年好'

l=func(1,2)

0.02500128746032715

新年好 元旦好

from functools import

wraps

defdeco(func):

@wraps(func)

#加在最內層函式正上方

他的作用是用來修復注釋,如果不加@wrap則注釋內容會被自動刪除

return func(*args,**kwargs)

def d(a=none):  #

定義乙個外層函式,給裝飾器傳引數--role

def foo(func): #

foo是我們原來的裝飾器函式,func是被裝飾的函式

def bar(*args, **kwargs): #

args和kwargs是被裝飾器函式的引數

#根據裝飾器的引數做一些邏輯判斷

ifa:

print("hello world")

else

:

print("

歡迎來到首頁。")

#呼叫被裝飾的函式,接收引數args和kwargs

func(*args, **kwargs)

return

bar

return

foo@d()

#不給裝飾器傳引數,使用預設的'none'引數

deffunc1(name):

print("

hello {}.

".format(name))

@d("哈哈

") #

給裝飾器傳乙個'哈哈'引數

deffunc2(name):

print("

hello {}.

".format(name))

if__name__ == '

__main__':

func1(

"andy")

func2(

"andy

")歡迎來到首頁。

hello andy.

hello world

hello andy.

開放封閉原則 

開放 : 對裝飾函式的擴充套件是開放的

封閉 : 對被裝飾的函式的修改是封閉的  

def inner1():

ret = func()

return ret

return inner1

def inner2():

ret = func()

return ret

return inner2

def inner3():

ret = func()

return ret

return inner3

def f():

print('cat')

return '哈哈哈'

print(f())

結果顯示

cat哈哈哈

#多個裝飾器對乙個函式進行裝飾,結果類似於俄羅斯套娃,語法糖在前先被呼叫的的在套娃的最外層,依次往裡。

# def wahaha():

# '''

# 乙個列印娃哈哈的函式

# :return:

# '''

# print('娃哈哈')

# # print(wahaha.__name__) #檢視字串格式的函式名

# print(wahaha.__doc__) #檢視注釋

函式裝飾器 類裝飾器

一 函式裝飾函式 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.不帶引數裝飾器 此方式...