关注【郑大钱呀
】【公】【众】【号】,我们一起交流,一起学习。
前言
Python写到这里,基本上大致覆盖的基础内容,到这里Python就告一段落了,后续的Python内容会穿插着更新,接下来的时间,主要是以Linux
的文章为主。
引入装饰器
在我们学习装饰器之前,先来了解一下函数名()
和直接使用函数名
这两种调用方式的区别,我们先看个代码示例:
在上面的代码中,我们定义了一个函数,我们使用了两种方式进行输出,一种是使用函数名()
,输出结果为hi
,即函数调用后的结果,另一种直接使用函数名
调用,输出结果返回的是一个函数对象。我们知道,在python 中一切皆是对象
,变量是对象,函数也是一个对象,那我们能否将函数作为入参,传给另一个函数呢?我们先来看个代码示例:
在上面的代码中,我们定义了三个函数,say_hi、say_good就是简单地打印两个字符串,重点看下say_something函数,此函数,我们定义了一个入参,用来传入函数对象,在方法体中,我们使用函数名()
的方式,来调用函数。由此可见我们是可以将函数作为变量传给另一个函数的
。这个时候你可能会问,可是这些和装饰器有什么关系呢?
其实在上面的示例中,我们已经创建了一个和装饰器差不多的函数了,就是上面的say_something
下面我们正式引入装饰器的概念,上面的示例只是为了更好的帮助你理解装饰器。
什么是装饰器?
装饰器本质上是一个Python函数,可以在让其他函数在不需要做任何代码变动的前提下额外的增加功能
,通过装饰器我们可以抽象出与函数功能无关的重复代码,进行复用,装饰器的作用就是为已存在的函数添加额外的功能。值得注意的是装饰器的返回值也是一个函数对象
。下面我们先通过一段代码感受一下:
在上面的代码中,我们定义了一个名为decorators_my
的装饰器,作用是为函数增加一个,打印函数名称的功能。我们来分析一下这个装饰器,有一个func
的入参,用于接收函数对象,在装饰器里嵌套了内部的函数,在这个内部的函数中,实现了打印函数的名称,并调用了func函数,最终返回内部函数,通过这样的方式,可以为传入的函数
,在自身的基础上再增加新功能。
从上面的代码中我们发现say_hi=decorators_my(say_hi)
这种使用装饰器的方式,有点长啊,我想要短一点,咋办?
在python中支持@
的语法糖,这有点类似于Java中的注解,在python 中装饰器正常的写法都是使用@
这种写法的。下面我们来看个示例:
从上面的代码中,我们使用@decorators_my
的方式,为say_hello()
增加装饰器,是不是方便了很多了呢,接下来我们打印一下被装饰器修饰后的方法名字:
我们发现say_hello
函数的名字,竟然不是say_hello了,而是装饰器返回后的函数名字。
这个怎么办呢?在python中,提供了functools模块的wraps函数
来解决这个问题,其实wraps也是一个装饰器,下面我们看下示例代码:
值得注意的是:functools模块需要先导入进来
,才可使用,我们通过使用@wraps
装饰器后,发现此时的say_hello.__name__
就是自己的名字了.
结尾
本期的内容就到这里了,如有不足之处还请大家多多指正,欢迎大家留言、关注、转发、收藏