千锋教育-做有情怀、有良心、有品质的职业教育机构

python装饰器的概念

来源:千锋教育
发布时间:2023-11-07 11:04:00
分享

装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂。为了讲清楚装饰器,我们讲一个生动的例子如下(由于后文装饰器的代码例子,全程和这个形象生动的说明很一致,所以务必看懂这个例子):

举个简单的例子:假设很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读你之前的这个的代码,稍微搞清楚一点它的逻辑,才敢给它添加新的东西。这样是不是很繁琐,要是你之前写的代码足够乱足够长,再去读它是不是很抓狂...

实际工作中,我们常常会遇到这样的场景,可能你的需求还不只是这么简单。那么有没有一种可以不对源码做任何修改,并且可以很好的实现你所有需求的手段呢?答案当然是有,这就是要介绍的python装饰器。有了装饰器,你除了不用担心前面提到的问题,并且还可以很好的处理接下来要做的事:那就是现在你又有了一个新的需求,比如为另一个函数添加计时功能,这时就非常简单了,把要装饰的函数丢给装饰器就好了,它会自动给你添加完功能并返回给你。

所以说:装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)

那么要想理清楚装饰器,我们必须先了解下面几样东西哦,如果对这些全部了解的话,那么装饰器就很简单了。

1,函数

函数是什么呢?

在python中,使用关键字def和一个函数名以及一个可选的参数列表来定义函数,函数使用return关键字来返回值,我们一般说的函数是指函数名,比如foo,而foo()已经执行函数了,foo()是什么类型取决于return的内容是什么类型!!!

函数的作用是什么?

减少重复代码

使程序变得可扩展

使程序变得易维护

2,函数作用域

在python函数中会创建一个新的作用域,python高手也会称函数有自己的命名空间,也就是说,当函数体中遇到变量时候,python首先会在该函数的命名空间中寻找变量名,python中有几个函数用来查看命名空间。

3,函数即对象

在python的世界里,函数和[1,2,3],'abc',8等一样都是对象,而且函数是最高级的对象(对象是类的实例化,可以调用相应的方法,函数是包含变量对象的对象)。

函数对象的调用仅仅比其他对象多了一个()而已,foo,bar和a,b一样都是个变量名,为什么函数只有加载到内存里面才可以被调用?

注意:这里说的函数都是指函数名,比如foo;而foo()已经执行函数了,foo()是什么类型取决于return的内容是什么类型!!!

以上内容为大家介绍了python装饰器的概念,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • Python 内嵌函数和闭包 内嵌函数:在函数内部定义函数,就是函数里面嵌套函数闭包:一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。(但是B函数,一定要是嵌套在函数A里面)。你在调用函
  • Python 递归函数 递归:函数调用自己本身递归的核心:1)递归推导式2)递归终止条件不过虽然递归很方便,但是尽量少用,以防栈溢出,而且会计算效率不高。'''例题:有5个人坐在一起,问第五个人多少岁
  • Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错。只要写中文,必须加一句:#--coding:utf-8--。文档编码是一种告诉程序——无论是计算机的操作系统还是Python代码——读取文档的规则。正
  • Python 之什么是类,什么是对象? 类即类别、种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体。那么问题来了,先有的一个个具体存在的对象(比如一个具体存在的人),还是
  • Python K-近邻算法概述 简单来说K-近邻算法采用测量不同特征值之间的距离方法进行分类。K最近邻(k-NearestNeighbor,KNN),是一种常用于分类的算法,是有成熟理论支撑的、较为简单的经典机器学习算法之一。该方法
  • Python k-近邻算法的优缺点 优点pythonk-近邻算法简单,易于理解,易于实现,无需参数估计,无需训练,即可以用来做分类也可以用来做回归和朴素贝叶斯算法比,对数据没有假设,准确度高,对异常值不敏感(个别噪音数据对结果的影响不是