python3装饰器视频_「python3入门视频教程」6.4 python装饰器详解

>>>点击查看 6.3 返回函数与闭包

「python3入门视频教程」6.4 python装饰器详解-1.jpg (20.34 KB, 下载次数: 0)

2018-6-10 11:18 上传

装饰器(Decorator)是python中最吸引人的特性,装饰器素质上还是一个函数,它可以让已有的函数不做任何改动的情况下增加功能。很是适合有切面需求的场景,好比权限校验,日志记录和性能测试等等。好比你想要执行某个函数前记录日志或者记录时间来统计性能,又不想改动这个函数,就可以通过装饰器来实现。

以日志为例

界说一个计算平方的函数,然后挪用:

「python3入门视频教程」6.4 python装饰器详解-2.jpg (17.83 KB, 下载次数: 0)

2018-6-10 11:18 上传

现在想在计算平方开始 和 结束打上标示,正常情况会去修改原函数,像这样

「python3入门视频教程」6.4 python装饰器详解-3.jpg (24.36 KB, 下载次数: 0)

2018-6-10 11:18 上传

从功能实现来看,这样是ok的。唯一的问题就是它需要侵入到原来的代码里面,把日志逻辑加上去,那么有没有可能在不修改业务代码的提前下,实现日志功能呢?用装饰器就能实现这一功能。因为函数可以作为另外一个函数的传参或者返回。也可以把函数赋值给一个变量。这里界说一个 squareLog 函数。传入一个函数参数,并且返回一个函数。

「python3入门视频教程」6.4 python装饰器详解-4.jpg (47.86 KB, 下载次数: 0)

2018-6-10 11:18 上传

这里并没有修改原函数。只是把square指向了经过 squareLog 措置过后的函数。这里的 squareLog 其实就相当于一个装饰器。素质上是一个闭包。在python中因为对装饰器提供了语法糖(@)的支持。所以使用装饰器会显得更加强年夜。上面的写法在python中可以修改如下:

「python3入门视频教程」6.4 python装饰器详解-5.jpg (43.67 KB, 下载次数: 0)

2018-6-10 11:18 上传

这样既可以在不消修改原函数 ,也可以不消修改挪用体例。就可以实现需要的日志功能

装饰器函数也可以传入参数。写法跟之前稍微有点不一样。

「python3入门视频教程」6.4 python装饰器详解-6.jpg (56.35 KB, 下载次数: 0)

2018-6-10 11:18 上传

不消语法糖 相当于下面这样

「python3入门视频教程」6.4 python装饰器详解-7.jpg (60.01 KB, 下载次数: 0)

2018-6-10 11:18 上传

使用 print(square.__name__) 打印函数名称,会发现函数名已经改变。如何连结函数名不变呢

使用 wraps

「python3入门视频教程」6.4 python装饰器详解-8.jpg (59.18 KB, 下载次数: 0)

2018-6-10 11:18 上传

下面是输出结果:

square log

func name square

start

x*x= 25

end

这里可能有些人看到有点诡异。为什么 func name square 的输出 是在 square log 下面。而不是上面。

我们看看没有用语法糖时候的写法。

wrap = log('square')

square = wrap(square)

square(5)

这里可以看出在我们使用 square.__name__ 的时候,要先执行 wrap = log('square')。所以输出就想上面这样

一个函数可以使用多个装饰器函数,执行顺序为从下到上。但又不是纯真的从下到上

不消语法糖的情况

「python3入门视频教程」6.4 python装饰器详解-9.jpg (38.81 KB, 下载次数: 0)

2018-6-10 11:18 上传

「python3入门视频教程」6.4 python装饰器详解-10.jpg (47.21 KB, 下载次数: 0)

2018-6-10 11:18 上传

解析:

执行完 square = log(square) 后

#这时候square相当于 这个函数

「python3入门视频教程」6.4 python装饰器详解-11.jpg (14.61 KB, 下载次数: 0)

2018-6-10 11:18 上传

执行完 square = sleep(square)。相当于把wrap函数传入 sleep 中。主意这个时候的sleep中的func是log中的square。于是输出就是下面这样了

输出:

log

sleep

start sleep

start

x*x= 25

end

end sleep

相当于

「python3入门视频教程」6.4 python装饰器详解-12.jpg (38.59 KB, 下载次数: 0)

2018-6-10 11:18 上传

「python3入门视频教程」6.4 python装饰器详解-13.jpg (40.96 KB, 下载次数: 0)

2018-6-10 11:18 上传

输出:

log

sleep

start sleep

start

x*x= 25

end

end sleep

如果这个时候修改一下 每次挪用func的x参数值,会发现结果很有意思

「python3入门视频教程」6.4 python装饰器详解-14.jpg (40.37 KB, 下载次数: 0)

2018-6-10 11:18 上传

「python3入门视频教程」6.4 python装饰器详解-15.jpg (38.85 KB, 下载次数: 0)

2018-6-10 11:18 上传

#跟上面一样 相当于 square = sleep(log(square))

square(5)

结果是

log

sleep

start sleep

start

x*x= 2500

end

end sleep

可以想一下为什么是这样

「python3入门视频教程」6.4 python装饰器详解-16.jpg (24.56 KB, 下载次数: 0)

2018-6-10 11:18 上传

更多视频教程见文章底部链接的【了解更多】

更多内容回复查看:

游客,如果您要查看本帖隐藏内容请回复

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值