Python装饰器的常见用途是什么?
在本文中,我们将学习Python装饰器的常见用途。
更多Python相关文章,请阅读:Python 教程
什么是Python装饰器?
Python装饰器是一段代码,允许在不改变底层函数定义的情况下添加或更新现有函数。程序运行时,它试图编辑自身的另一部分,这被称为元编程。
装饰器是一种函数类型,它接收一个函数并返回另一个函数或接收一个类并返回另一个类。它可以是任何可调用对象(函数、类、方法等),它可以返回任何东西;它也可以接收一个方法。
Python装饰器使用简单。
装饰器接收一个可调用对象(callable),它是任何实现特殊方法__call()的对象,添加一些功能,然后返回一个可调用对象。
示例
@somedecorator
def exmple_decorators():
print("Hello tutorialspoint python decorators")
写装饰器需要完全不同的技能。需要完全理解以下内容:
- 闭包
- 使用函数作为一等(first-class)参数,
- 可变参数
- 参数解包
- 甚至一些关于Python如何加载源代码的信息。
掌握和完善所有这些需要很长时间。而且你已经有了很长的学习清单。
把时间花在这上面值得吗?
显然答案是“是”。编写装饰器的主要优势是什么?它们能够让你在日常开发中轻松、有力地执行什么任务?
让我们看看!
分析、日志记录和仪表板
我们经常需要具体衡量正在发生的事情并收集量化不同操作的指标,特别是在大型应用程序中。装饰器可以通过封装自己的函数或方法来极其明了地解决这个需求。
验证和运行时检查
Python的类型系统是强类型但动态的。虽然它有许多优点,但这意味着一些问题可能会想方设法通过,而更静态类型的语言(如Java)可能会在编译时检测到这些问题。
另外,你可能想要在数据进入和退出系统时实现更复杂的自定义检查。装饰器可以帮助你管理所有这些,同时将其应用于多个函数。
创建框架
一旦你学会了写装饰器,你就可以从它们简单的语法中获益,这使你可以轻松地为语言添加语义。它是扩展Python语法的下一个最佳方法。
许多著名的开源框架使用此功能。Web应用框架Flask使用它来将URL路由到处理HTTP请求的函数。
重用不可能重用代码
通过优雅的函数语法、函数式编程支持和完整的对象系统,Python提供了一些非常强大的工具,可将代码封装成易于重用的形式。但是,这些工具无法捕获某些代码重用模式。
考虑使用不稳定的API。你向理解JSON over HTTP的服务器发送查询,它99.9%的时间都可以工作。但是小部分请求会导致服务器返回内部错误,需要你重新发送请求。在这种情况下,你可以添加一些重试逻辑。
示例
# 创建一个装饰器函数
def decoratorFunction(demofunction):
def innerFunc():
print("是的...它是一个装饰函数")
demofunction()
return innerFunc()
# 创建一个普通常规函数
def normalFunction():
print("是的...它是一个普通常规函数")
decoratedResult = decoratorFunction(normalFunction)
decoratedResult
输出
在执行上面的程序时,将生成以下输出 –
是的...它是一个装饰函数
是的...它是一个普通常规函数
在前面的示例中, decoratorFunction() 是一个装饰器。简言之,装饰器是一个包装器,它包装一个对象(而不对其进行修改)并向原始对象添加新功能。因为这是一种流行的技术,Python 提供了一个语法特征(称为装饰器),以使其更容易。考虑下面的示例 –
下面的函数:
@decorated_func
def ordinary_function():
print("这是一个普通函数")
等同于
def ordinary_function():
print("这是一个普通函数")
decorated = decorated_func(ordinary_func)
提升你的职业生涯
开始编写装饰器时会有一些困难。虽然这不是什么高深莫测的东西,但是需要学习和理解细节,这需要付出很多努力,因此许多开发人员可能不会费心去学习。但是这对于你有利。如果你成为团队中学会编写装饰器并编写解决实际问题的装饰器的人,其他开发人员会使用你的装饰器。一旦编写装饰器的繁重工作完成后,它们的使用方法非常简单。这可以极大地增加您开发的代码的积极影响。它甚至可能让你成为大师。
结论
装饰器是一个不可思议的特性,可以用于广泛的用途。它不仅仅是“接受函数或类并返回函数或类”的东西。
无论你使用何种方式学习构建装饰器,你都会对你能够以它们实现的功能和它们将如何永久地改变你编写 Python 代码的方式感到兴奋!
极客教程