Python|装饰器

一对象的概念

python 的所有内容都可以作为对象,这意味着这些内容可以作为参数作用于其他的“对象”,这不难理解,就像在函数中,可以把另一个函数作为参数,甚至是类作为参数,,因此经常看到函数的“嵌套”使用。

def hi():

return “hi yasoob!”

def doSomethingBeforeHi(func):

print(" 我是在 executing hi() 之前的装饰 ")

print(func())

doSomethingBeforeHi(hi)

在这个例子中得到的输出如下:

我是在 executing hi() 之前的装饰

hi yasoob!

可以的看到:

之前定义的函数 hi 作为 doSomethingBeforeHi 这个函数的参数, 并且在输出中并不影响它本身。

二装饰器的作用

顾名思义,装饰器的首要作用就是“装饰”,它装饰的种类有很多,只要是 python 的对象都可以被它所装饰。那装饰的意义在哪里呢?

在一个函数增加功能但是不改变其中代码时,就可以使用装饰器来完善这种功能,这样做的意义在哪里呢?当这种新增功能需要运用到很多函数时,就只需要调用装饰器,而不是在每个函数上去修改,这样就节省了很多的时间和精力。

三装饰器的用法

最简单的装饰器其实就是上面的案例,这也是最直接易懂的——将待“装饰”的函数作为参数放入起“装饰”作用的函数中。当然, python 提供了更加简洁且可用性更强的方法。

首先引入对应的模块,然后定义装饰器,装饰器的定义方法和函数一致,在装饰器中,使用 @wraps() 的方法来接受一个函数进行封装,在它之后定义需要增加的内容,具体操作相信大家看代码就一目了然了。

from functools import wraps# 引入 wraps 模块

def a_new_decorator1(a_func):# 定义装饰器

@wraps(a_func)# 接收 “a_func“ 函数进行装饰

def wrapTheFunction1():# 定义装饰内容

print(" 我是在 a_func () 之前的装饰 ")

a_func()# 保留函数自身功能

print(" 我是在 a_func () 之后的装饰 ")

return wrapTheFunction1

在这个例子中,“ wrapTheFunction1 ”就是定义的“装饰”函数,也可以理解成“装饰”的方法。在装饰器定义完成后,接下来就是它的封装和使用了。封装装饰器的方法很简单,只需要 @ 符号加上装饰器名称即可。

@a_new_decorator1

调用装饰器时,只需要在封装好的装饰器下面定义或者调用相应的函数即可。

@a_new_decorator1

def a_function_requiring_decoration1():

print(" 我是函数本身功能 ")

输出上面的函数可以看到如下结果:

我是在 a_func () 之前的装饰

我是函数本身功能

我是在 a_func () 之前的装饰 )

需要注意的是,调用一次装饰器只能对一个函数装饰一次,多余的函数将不被装饰,这很像画油画,被装饰的函数就像是画板,即使两张画板叠在一起,颜色也只对最上层的画板起作用。但是在画油画时,画板颜色是可以被层层覆盖的,这是不是意味着装饰器也可以这样叠加呢?我们来看下面的例子。

@a_new_decorator1

@a_new_decorator1

def a_function_requiring_decoration2():

print(" 我是另一个函数 ")

对它进行输出,得到如下结果

我是在 a_func () 之前的装饰

我是在 a_func () 之前的装饰

我是另一个函数

我是在 a_func () 之后的装饰

我是在 a_func () 之后的装饰

通过输出我们可以发现装饰器效果也是可以层层叠加的,这样就让“装饰”这个功能变得更加有可用性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值