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