这篇文章主要介绍了如何使用Python装饰器修改函数行为的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Python装饰器修改函数行为文章都会有所收获,下面我们一起来看看吧。装饰器在 Python中是一个非常强大和有用的工具,因为它允许程序员修改函数或类的行为。装饰器允许我们包装另一个函数,以扩展包装函数的行为,而无需修改基础函数定义。这也被称为元编程,因为程序本身在程序运行时会尝试修改自身的另一部分。装饰器是语法糖: 在代码中利用更简洁流畅的语法实现更为复杂的功能。我们知道,Python 一切皆对象。这意味着 Python 中的函数可以用作参数或作为参数传递。一等函数的属性:函数是 Object 类型的实例。可以将函数存储在变量中。可以将该函数作为参数传递给另一个函数。可以从函数中返回函数。可以将它们存储在数据结构中,例如哈希表,列表等。让我们看一个这样的例子。定义了一个 hello() 函数,然后将 hello 函数分配给 another_hello 变量,然后调用这个变量,得到的结果是 hello 函数被执行。既然 Python 中的函数是对象,那么除了可以简单的调用之外,就可以把函数作为对象传递给另一个函数。但是,上面的代码使用了内部函数我们可以通过简单地用装饰器函数 print_hello() 来装饰 print_welcome() 函数。装饰器可以简化我们的操作。功能完全一样,但它的代码更简洁。即通过 @ 符号简化装饰器的使用,如下所示:通过这样做,我们能够消除将一个函数显式传递到另一个函数中的使用。Python 装饰器隐式处理这一点。为了演示它们的实用性,让我们构建一个函数,该函数采用另一个函数并对其执行进行计时。在这里,使用装饰器的好处是它允许我们遵循 DRY 编程原则。装饰器可用于测量函数执行所需的时间。 如果你定义一个简单的睡眠函数,以计算该函数的运行时。分析一下上面的代码:定义了一个函数 timeit()
接受另一个函数该函数还有另一个内部函数 timed()
函数跟踪开始时间,执行修饰函数,跟踪结束时间,计算差值并返回结果最后,外层函数返回内层函数当我们将此装饰器函数应用于我们的函数 print_welcome()
时,首先会返回欢迎问候语,然后显示执行时间。与上面的例子类似,我们可以在程序运行时使用装饰器将有用的信息打印到终端。例如,我们可能想知道正在运行哪个函数以及当前时间。也可以使用装饰器传递到日志文件:在上面的示例中,在运行函数之前,我们的装饰器打印当前日期和时间以及将要运行的函数的名称。如果您正在运行较长的脚本,并且只是想知道程序的位置,这可能很有用。让我们以 Web 应用程序的用例为例。当您在 Flask 中构建 Web 应用程序时,您总是会编写 url 路由。 每条路线都是 Web 应用程序中的特定页面。 打开页面 /about
可能会调用 about_page()
方法。到目前为止,您已经学习了如何创建一些有用的 Python 装饰器。然而,这些装饰器都没有传入参数。在本节中,您将学习如何创建接受参数的 Python 装饰器。为此,我们将允许在 Python 语法魔术解压缩。使用 func_name(*args,**kwargs)
,它将解压缩所有参数和所有关键字参数。通过在装饰器中使用它,可以确保装饰器将接受任意数量的参数或关键字参数。这使得它们在重复使用时更加实用。上述方法的美妙之处在于它同时接受位置和关键字参数。因此,即使我们以以下任何格式执行该函数,该函数也将运行:add_nums(1024, 2020)
add_nums(1024, b = 2021)
a免费云主机域名dd_nums(a = 1024, b = 2222)
关于 Python 装饰器的一个有趣的方式是:可以同时使用多个装饰器。这意味着您可以将多个装饰器应用于单个函数。为了理解这一点,来看一个例子:我们的装饰器函数所做的唯一事情就是打印出数字 1 和数字 2。通过将装饰器 @one
放在 @two
之前,您可以将 two()
包装的函数包装为 one()
。为了说明这一点,您可以切换顺序以查看如何修改行为:通过首先放置 @two
装饰器,该函数成为最外层的函数。关于“如何使用Python装饰器修改函数行为”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何使用Python装饰器修改函数行为”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。
相关推荐: JavaScript如何使用GetUrlParam函数
小编给大家分享一下JavaScript如何使用GetUrlParam函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!GetUrlParam:获取Url参数,返回一个对象以上是“Ja…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。