python装饰器

关注【郑大钱呀】【公】【众】【号】,我们一起交流,一起学习。

前言

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__就是自己的名字了.

结尾

本期的内容就到这里了,如有不足之处还请大家多多指正,欢迎大家留言、关注、转发、收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑大钱呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值