技术原理

如何在Python中实现Decorators?

装饰师在Python中是强大的工具。它允许程序员修改函数或类的行为。Decorators允许包装另一个函数来扩展包装函数的行为,而不必修改它。本文将简要介绍以下主题。

在Python中的Decorators函数可以作为参数传递函数可以在函数中定义函数可以返回函数也可以将函数分配给变量我们在Python中的第一个Decorators

让我们开始吧

Decorators在Python

中今天,我们将讨论Python的非常完整性即装饰师。装饰可以被认为是一个非常有用和强大的工具,但只有正确使用。简单地说:它们是修改其他函数功能的函数。它们有助于使我们的代码更短、更具Python风格。

定义:decorator是Python中的一种设计模式,允许用户在不修改现有对象结构的情况下向其添加新功能。通常在定义要修饰的函数之前调用Decorators。

Python Logo- decorators- in-python

警告:乍一看,它们太混乱了,所以,勒紧腰带吧,因为我们要进行一次深入的潜水

在直接潜水之前,我们将了解一些在理解装饰器之前应该知道的事情。Python中的函数是一等公民。这意味着它们支持诸如作为参数传递、从函数返回、修改和分配给变量的操作。

现在,让我们来看看可以作为参数

传递的函数可以作为参数

传递的函数,您必须知道这一点,如果不知道,请先访问以下链接,然后再返回。

现在,因为函数是对象,函数接受对象作为参数,我们可以得出结论,我们可以把函数传递给函数。让我们用一些代码更好地理解它。

由于函数的每个参数都是对对象的引用,而且函数也是对象,所以我们可以将函数或更好的“对函数的引用”作为参数传递给函数。

定义问候语(姓名):def iôu willôu greet(问候,姓名=“Avikar”):打印(问候(姓名)我会问候(问候)

我们可以清楚地看到,函数greet()已作为参数传递给函数i_will嫒greet()。

//Output:

Hey Pallavi欢迎来到edureka的世界

注意:函数greet已传递给i嫒will嫒greet,没有括号。因为如果您使用括号,那么它不会传递函数,而是传递函数的定义。

让我们再考虑一个示例,使我们的基础知识具体化。

从数学导入sin,cos定义计算(func):对于[1,2,3,4,5]中的i:返回资源打印(sin的值为{}”.format(calculate(sin)))

//Output:sin的值是0.1761616497223787 cos的值是-1.2358184626798336

让我们看看可以在函数中定义的第二个函数

函数可以在函数

中定义函数在函数中拥有或定义函数的概念是完全的新的C或C 程序员。我们已经知道嵌套,令人惊讶的是我们也可以嵌套函数,也就是说,我们可以在函数中定义任意多个函数。

def问题():print(“python无聊吗”)打印(“肯定不是。愚蠢!)回答()return“现在你知道该学什么了”def温度(t):返回9*x/5 32打印(温度(35))

//Output:95.0度

让我们转到第三个也可以返回函数的函数。

函数也可以返回函数

不必在另一个函数中执行函数,我们也可以将其作为输出返回。

打印(“放置蛋糕底部并用{}和水果装饰”。格式(风味))return“将樱桃放在{}蛋糕的顶部”美味=烤蛋糕(“奶油威士忌”)

输出:放置蛋糕的底部并用奶油糖果和水果装饰它在奶油糖果蛋糕顶部放置樱桃

让我们考虑一个有用的示例,其中我们假设可以传递任意数量的参数(*args)。为了更好地理解,请访问Edureka社区。

我们可以概括我们的工厂函数,以便它可以处理任意阶的多项式

Image- Decorators in Python- Edureka

定义多项式创建器(*coeff):定义多项式(x):对于索引,枚举中的c(coeff[::-1]):返回资源

上述多项式创建函数与二次方程系数一起传递时,

定义多项式()函数。返回多项式函数。“

“现在,如果我们可以将这个返回的函数赋给一个变量(如前所述),我们可以直接使用我们包装的函数。”

“p2=多项式创建者(1,8,-1,3,2)打印(x,p1(x),p2(x))

注意当p1(x)被称为coeff时。是2,3和-1,表示当多项式创建器()被分配给p1或p2时定义了多项式(),但没有被调用。

所以当我们调用p1()或p2()时,我们将参数传递给多项式(x)。

从输出中可以看出,

首先,多项式创建器被调用了两次用于p1和p2。稍后,对每个print语句分别调用了polynomy()。”

“//Output:-2 1-56-1-2-9 0-1 2 1 4 13

现在让我们来看看最后一个可以分配给变量

的函数可以分配给变量

注意到上面代码中的tasty=bakeôcake(“butterscotch”)吗?是的,对!我们也可以把函数赋给变量即。我们创建函数的别名。上述赋值的用处是:

,即使删除了函数,也可以通过创建的变量使用它。试试德尔贝克蛋糕

在我们的缸内所有这些知识,我们准备潜水。但是,如果我们没有潜水面罩(很小但很重要的部分),这种驾驶不会持续太久。Closure(我们的潜水掩码)

Python允许嵌套函数访问封闭函数的外部范围。这是decorators中的一个关键概念。

例如,让我们考虑一个外部和内部函数及其变量。

外部定义():风险值=10内部定义():打印(内部{}”格式(var)中的“变量值)打印(内部varb的值为{}”.format(varb))打印(“内部{}”.format(var)之外的var值)

//Output:内部10内的var值内部10外的var值内部10内的var值是内部10回溯(最后一次调用):文件“”,第1行,inouter()

转到我们的第一个装饰器

我们的第一个装饰器

来创建装饰器:

需要装饰的功能或类。装饰函数。将返回的包装函数。”

“为了正确理解它,让我们首先考虑一个示例:

打印(内部外部)打印(“内部功能”函数()返回内部def需要装饰():print(“内部函数调用”)内-外内部功能内部函数调用

很容易理解。对!”这里我们调用了outer(),函数need_decoration()作为参数。因此,当调用outer时,将执行第一个print语句,并使用func将函数inner()定义为need-decoration并返回内部函数。

此返回的函数存储在need-decoration中。

现在,当需要修饰是通过括号执行时,内部函数被调用。

两件重要的事情你需要理解:

1。函数调用和函数定义之间的区别。

导入数学temp=math.sin#temp被赋予函数定义-0.7568024953079282打印(临时)

2。有人可能会认为,由于need-decoration已经失去了它原来的定义并被分配给了inner(),那么当need-decoration从inner()调用时会发生什么情况呢

如果你认为它可能会进入一个无止境的循环,在这个循环中,inner()调用func()作为need-decoration(),need-decoration再次等同于调用inner(),那么相信我,你并不是唯一陷入这种困境的人。

这就是为什么decorators变得有点笨拙和难以理解的原因。

所以,这根本不会发生。当您通过调用outer as need_decoration=outer(need_decoration)来定义inner时,inner()会自动将need_decoration的定义存储在那里。我们稍后将深入探讨这个问题。

您一定在想“@”在哪里,装饰师的荣耀。你会很高兴你已经使用它,但在一个隐藏的方式。needúdecoration=外部(needúdecoration)可以替换为定义在needúdecoration之上的@outer。所以在重写了上面的代码

之后def需要装饰():内-外内部功能又是内在的

我们可以用decorators做很多事情,比如多个decorators可以应用于单个函数。但我们将在下一篇文章中对此进行研究。

这将带到本文的末尾,在这里我们通过几个例子了解了如何在python中使用Decorators。我希望您对本教程中与您分享的所有内容都很清楚。

如果您发现有关“Python中的Decorators”的文章,请查看Edureka Python Certification Training,这是一家值得信赖的在线学习公司,拥有遍布全球的250000多名满意的学习者。

我们是这里可以帮助您完成旅程中的每一步,并为希望成为Python开发人员的学生和专业人士设计课程。本课程的目的是让您在Python编程方面有一个良好的开端,并为您提供核心和高级Python概念以及各种Python框架(如Django)的培训。

如果您遇到任何问题,请随时在“Python中的Decorators”的评论部分提出您的所有问题,我们的团队将很高兴回答:“

你也可能喜欢

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
人工智能 工作 投稿者
我还没有学会写个人说明!
最近文章
  • * 没有更多文章了
  • 热门搜索

    分类目录