開放:對函式的擴充套件是開放的
封閉:對函式的修改是封閉的
在不更改原函式呼叫方式的前提下,對原函式新增新功能
#①引子——為什麼要有裝飾器
為了在不修改原函式的基礎上為函式新增新功能,產生了裝飾器
#②簡單裝飾器
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
defdeco(f):
"""原函式前新增的功能
"""res = f(*args,**kwargs)
"""原函式後新增的功能
"""return
res
return
@deco
def func(*args,**kwargs):
pring(
'這是原函式')
func(*args,**kwargs)
如果想使用原函式的雙下方法,則需要再呼叫系統裝飾器@ wraps(func)
from functools importwraps
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:
defouter(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...