Python 函式(裝飾器)

2022-09-05 06:00:15 字數 2683 閱讀 7026

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

封閉:對函式的修改是封閉的

在不更改原函式呼叫方式的前提下,對原函式新增新功能

#

①引子——為什麼要有裝飾器

為了在不修改原函式的基礎上為函式新增新功能,產生了裝飾器

#②簡單裝飾器

defdeco(f):

def

"""原函式前新增的功能

"""f()

"""原函式後新增的功能

"""return

deffunc():

print('

這是原函式!')

func =deco(func)

func()

#③裝飾器的語法糖

defdeco(f):

def

"""原函式前新增的功能

"""f()

"""原函式後新增的功能

"""return

@deco

#——>此處效果等同於 func = deco(func)

deffunc():

print('

這是原函式')

func()

#④帶返回值的裝飾器

defdeco(f):

def

"""原函式前新增的功能

"""res =f()

"""原函式後新增的功能

"""return

res

return

@deco

deffunc():

print('

這是原函式')

func()

#⑤帶引數、帶返回值的裝飾器

defdeco(f):

"""原函式前新增的功能

"""res = f(*args,**kwargs)

"""原函式後新增的功能

"""return

res

return

@deco

def func(*args,**kwargs):

print('

這是原函式')

func(*args,**kwargs)

#⑥多層裝飾器

#todo

#⑦多個裝飾器修飾同乙個函式

#todo

def

deco(f):

"""原函式前新增的功能

"""res = f(*args,**kwargs)

"""原函式後新增的功能

"""return

res

return

@deco

def func(*args,**kwargs):

pring(

'這是原函式')

func(*args,**kwargs)

如果想使用原函式的雙下方法,則需要再呼叫系統裝飾器@ wraps(func)

from functools import

wraps

defdeco(func):

@wraps(func)

#加在最內層函式正上方

return func(*args,**kwargs)

return

@deco

deforigin_func():

'''這是原函式的注釋

:return:

'''print('

這是原函式')

#print(origin_func.__name__

)>>>origin_func

print(origin_func.__doc__

)>>>這是原函式的注釋

>>> :return:

def

outer(flag):

deftimer(func):

def inner(*args,**kwargs):

ifflag:

print('''

執行函式之前要做的

''')

re = func(*args,**kwargs)

ifflag:

print('''

執行函式之後要做的

''')

return

re

return

inner

return

timer

#此處先執行函式呼叫outer(false) —> 返回timer —>@timer —>func = timer(func) —> func = inner

@outer(false)

deffunc():

print(111)

func()

def

definner1():

print('')

func()

print('')

return

inner1

def

definner2():

print('')

func()

print('')

return

inner2

#def

f():

print('

in f')

f()#

結果》 in

f

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

python裝飾器 裝飾器工廠函式

使用裝飾器實現如下所示的列印 小白聯盟def printequel func1 def inner1 print 15 func1 return inner1 def printstar func2 def inner2 print 15 func2 return inner2 printequel...