時間:2020-10-11來源:www.outletmksalestore.com作者:電腦系統城
無參修飾 ,無參數時不需要調用
?1 2 3 4 5 |
def log1(func): func() @log1 def test(): print ( 'test:' ) |
有參修飾
?1 2 3 4 5 6 7 8 |
def log2(func): def inner( * args, * * kwargs): func( * args, * * kwargs) return inner @log2 def test(num): print ( 'testlog2:' ,num,test.__name__) test( 20 ) #相當于log(test(20)) |
@wraps可以保證裝飾器修飾的函數的name的值保持不變
不帶參數的裝飾器
?1 2 3 4 5 6 7 8 9 |
def log3(func): @wraps (func) def inner( * args, * * kwargs,): func( * args, * * kwargs) return inner @log3 def test(num): print ( 'testlog3:' ,num,test.__name__) test( 30 ) #相當于log(test(30)) |
帶參數的裝飾器
?1 2 3 4 5 6 7 8 9 10 11 12 13 |
def log4(level): def log(func): @wraps (func) def inner( * args, * * kwargs,): if level = = "warn" : print ( "%s is running" % func.__name__) func( * args, * * kwargs) return inner return log @log4 (level = "warn" ) def test(num): print ( 'testlog4:' , num, test.__name__) test( 40 ) |
實現帶參數和不帶參數的裝飾器自適應
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
def log(arg): if callable (arg): # 判斷參入的參數是否是函數,不帶參數的裝飾器調用這個分支 def log3(func): @wraps (func) def inner( * args, * * kwargs, ): func( * args, * * kwargs) return inner return log3 else : def log4(func): @wraps (func) def inner( * args, * * kwargs,): if arg = = "warn" : print ( "%s is running" % func.__name__) func( * args, * * kwargs) return inner return log4 @log (arg = None ) def test(num): print ( 'testlog:' , num, test.__name__) test( 0 ) |
返回入參出參
?1 2 3 4 5 6 7 8 9 10 11 12 |
def log5(func): def inner( * args, * * kwargs): print ( '入參:' ,func.__name__, args, kwargs) res = func( * args, * * kwargs) print ( '出參:' ,func.__name__, res) return res return inner @log5 def test(num): print ( 'testlog5:' , num, test.__name__) return num print (test( 50 )) |
類裝飾器
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Loging: def __init__( self ,level): self .level = level def __call__( self ,func): @wraps (func) def inner( * args, * * kwargs): if self .level = = "warn" : self .notify(func) func( * args, * * kwargs) return inner def notify( self ,func): print ( "%s is running" % func.__name__) @Loging (level = "warn" ) def test(num): print ( 'testLoging:' , num, test.__name__) test( 0 ) |
以上就是python 裝飾器的使用示例的詳細內容,
2022-03-01
PHP如何從txt文件中讀取數據詳解2022-03-01
分享5個方便好用的Python自動化腳本2021-03-29
Python中pycharm編輯器界面風格修改方法