- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
恶补了 Python 装饰器的六种写法,你任凭问~
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下添加额外功能,装饰器的前往值也是一个函数对象。
它经常用于有切面需求的场景,比如:插入日志、功能测试、事务处理、缓存、权限校验等场景。
装饰器是处理这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并连续重用。
装饰器的使用方法很固定
先定义一个装饰器(帽子)
再定义你的业务函数或者类(人)
最终把这装饰器(帽子)扣在这个函数(人)头上
就像下面这样子
#?定义装饰器def?decorator(func):????def?wrapper(*args,?**kw):????????return?func()????return?wrapper#?定义业务函数并进行装饰@decoratordef?function():????print(hello,?decorator)
实际上,装饰器并不是编码必需性,意思就是说,你不使用装饰器完全可以,它的消灭,应当是使我们的代码
愈加优雅,代码结构愈加清楚
将实现特定的功能代码封装成装饰器,提高代码复用率,添加代码可读性
接下来,我将以实例讲解,如何编写出各种简约及简单的装饰器。
第一种:一般装饰器
首先咱来写一个最一般的装饰器,它实现的功能是:
在函数执行前,先记录一行日志
在函数执行完,再记录一行日志
#?这是装饰器函数,参数?func?是被装饰的函数def?logger(func):????def?wrapper(*args,?**kw):????????print(我预备开头执行:{}?函数了:.format(func.__name__))????????#?真正执行的是这行。????????func(*args,?**kw)????????print(仆人,我执行完啦。)????return?wrapper
假如,我的业务函数是,计算两个数之和。写好后,直接给它带上帽子。
@loggerdef?add(x,?y):????print({}?+?{}?=?{}.format(x,?y,?x+y))
然后执行一下 add 函数。
add(200,?50)
来看看输出了什么?
我预备开头执行:add 函数了:200?+?50?=?250我执行完啦。
其次种:带参数的函数装饰器
通过上面两个简约的入门示例,你应当能体会到装饰器的工作原理了。
不过,装饰器的用法还远不止如此,深究下去,还大有文章。今日就一起来把这个学问点学透。
回过头去看看上面的例子,装饰器是不能接收参数的。其用法,只能适用于一些简约的场景。不传参的装饰器,只能对被装饰函数,执行固定规律。
装饰器本身是一个函数,做为一个函数,假如不能传参,那这个函数的功能就会很受限,只能执行固定的规律。这意味着,假如装饰器的规律代码的执行需要依据不同场景进行调整,若不能传参的话,我们就要写两个装饰器,这明显是不合理的。
比如我们要实现一个可以定时发送邮件的任务(一分钟发送一封),定时进行时间同步的任务(一天同步一次),就可以本人实现一个 periodic_task (定时任务)的装饰器,这个装饰器可以接收一个时间间隔的参数,间隔多长时间执行一次任务。
可以这样像下面这样写,由于这个功能代码比较简单,不利于学习,这里就不贴了。
@periodic_task(spacing=60)def?send_mail():?????pass@periodic_task(spacing=86400)def?ntp()????pass?
那我们来本人制造一个伪场景,可以在装饰器里传入一个参数,指明国籍,并在函数执行前,用本人国家的母语打一个招呼。
#?小明,中国人@say_hello(china)def?xiaoming():????pass#?jack,美国人@say_hello(america)def?jack():????pass
那我们假照实现这个装饰器,让其可以实现 传参 呢?
会比较简单,需要两层嵌套。
def?say_hello(contry):????def?wrapper(func):????????def?deco(*args,?**kwargs):????????????if?contry?==?china:????????????????print(你好!)????????????elif?contry?==?america:????????????????print(hello.)????????????else:????????????????return??????????
文档评论(0)