系统学习Python——装饰器:使用和定义装饰器

发布时间:2023年12月18日

分类目录:《系统学习Python》总目录


正如我们所看到的,Python本身带有扮演特殊角色的内置装饰器一一静态方法和类方法声明、property创建等。此外,很多流行的Python工具包括装饰器,可执行管理数据库或用户接口逻辑等任务。在这样的情况下,我们不需要知道装饰器如何编码就可以完成任务。

对于更为通用的任务,程序员可以为自己编写任意的装饰器。例如,函数装饰器可用来扩增函数,这通过添加调用跟踪和日志记录,在调试时执行参数验证测试,自动获取和释放线程锁,计时调用函数的时间以进行优化等的代码来实现。你可以想象添加到函数调用中(实际包装该函数调用)的任何行为,都可以作为定制函数装饰器的备选。

另外一方面,函数装饰器旨在扩增单一的特定函数或方法调用,而不是完整的对象接口。类装饰器更多地充当后一种角色一一因为它们可以拦截实例创建的调用,并且可以用来实现任意的对象接口扩展或管理任务。例如,定制的类装饰器可以跟踪、验证或是扩增一个对象的每个属性引用。它们也可以用来实现代理对象、单例类以及其他常用的编程模式。实际上,我们会发现许多类装饰器与在第31章中见到的委托编程模式有很大的相似之处,事实上上类装饰器也是这一编程模式的主要应用。

为什么使用装饰器

像很多高级Python工具一样,从纯技术的视角来看,并不是严格需要装饰器:我们往往可以使用简单的辅助函数调用或其他的技术来实现它们的功能。并且从基本的层面出发,我们总是可以手动地编写装饰器所自动执行的名称重绑定。也就是说,装饰器为这样的任务提供了一种显式的语法,它使得意图更加明确,能够最小化繁冗的扩展代码,并且有助于确保正确的API使用:

  • 装饰器有一种非常明确的语法,这使得它们比那些可任意远离主体函数或类的辅助函数调用更容易为人们发现。
  • 当主体函数或类定义的时候,装饰器应用一次;在对类或函数每次调用的时候,不必添加额外的代码,这点在未来可能必须改变。

基于以上两点,装饰器使API的用户不太可能忘记根据API的要求扩展一个函数或类。换句话说,除了其技术模型之外,装饰器提供了一些与代码维护和一致性相关的优点。此外,作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使未来的改进更容易。

装饰器也有一些潜在的缺点:

  • 当它们插人包装器逻辑,它们可以修改所装饰对象的类型
  • 当用作调用或接口代理时,它们可能引发额外的调用。另外一方面,同样的考虑也适用于任何为对象添加包装逻辑的技术。

我们将在《系统学习Python——装饰器》系列文章的现实代码的语境下说明这些权衡。尽管是否选择使用装饰器仍然多少有些凭主观经验,但它们的优点引人注目,足以使其快速成为Python世界中的最佳实践。为了帮助你做出决定,让我们来看一些细节。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

文章来源:https://blog.csdn.net/hy592070616/article/details/135070320
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。