转:如何更通俗地讲解Python的装饰器?
本文参考:
廖雪峰:装饰器 (推荐)
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于插入日志、性能测试、事务处理、缓存、权限校验等场景。
示例1:简单装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import logging def use_logging(func): def wrapper(): logging.warning( '{} is running' . format (func.__name__)) return func() # 把foo当做参数传递进来时,执行func()就相当于执行foo() return wrapper def foo(): print ( 'i am foo' ) ff = use_logging(foo) # 因为装饰器use_logging(foo)返回的是函数对象wrapper,这条语句相当于ff=wrapper ff() # 执行ff()就相当于执行wrapper() |
示例2:语法糖
1 2 3 4 5 6 7 8 9 10 11 12 | def use_logging(func): def wrapper(): logging.warn( "%s is running" % func.__name__) return func() return wrapper @use_logging def foo(): print ( "i am foo" ) foo() |
示例3:业务函数test带参数
1 2 3 4 5 6 7 8 | def wrapper(name): logging.warn( "%s is running" % func.__name__) return func(name) return wrapper @use_logging def foo(name): print ( "i am %s" % name) |
1 2 3 4 5 6 7 8 9 10 | def square_it(fn): def warp( * args): return fn( * args) * * 2 return warp @square_it def test(x): return x + 2 print (test( 2 )) |
示例4:带参数的装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def use_logging(level): def decorator(func): def wrapper( * args, * * kwargs): if level = = "warn" : logging.warn( "%s is running" % func.__name__) elif level = = "info" : logging.info( "%s is running" % func.__name__) return func( * args) return wrapper return decorator @use_logging (level = "warn" ) def foo(name = 'foo' ): print ( "i am %s" % name) foo() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-08-13 转:pytorch permute()函数
2020-08-13 PyTorch,LSTM,batch_first=True