继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

python 类装饰器的用法

2020-11-20 15:32:522847浏览

deweizhang

1实战 · 19手记 · 4推荐
TA的实战

hello, 大家好, 好久不写python手记了, 之前有幸 录制了   金职位 Python工程师2020版 课程的 入门课程. 在这套课程中, 讲解了 python中的装饰器的用处以及函数装饰器的入门用法. 但是对于装饰器来说, python 还有更高级的用法(也不能说是高级吧, 应该说是另外的用法)----类装饰器的定义和使用. (当然如果基础还没有打捞, 建议去看 金职位 Python工程师2020版 ?)


本手记 我们 分2中类装饰器的用法:

1: 不带参数的装饰器用法

2: 带参数的装饰器用法


好, 那么我们先从1开始, 我们先上图, 看图说话:

http://img2.sycdn.imooc.com/5fb76e410001644306330444.jpg

分析:

(1)我们定义了一个 A 类, 在这里 我们定义里 构造函数 init, 并且将 被装饰器调用的函数传入, 并给予 self.func,

(2)接下来, 我们定义__call__ 将被装饰器调用函数的参数传入(我们在基础课程中有讲过call的含义, 这里就不再解释了), 我们可以在__call__函数中再添加装饰器逻辑, 比如验证些什么, 或者对 func返回的结果做处理等等(只要是你业务逻辑需要的)

(3) 好, 定义好了一个 A类,后我们定义一个函数 test_a, 并且将A类以为装饰器的形式放在test_a的上边. 此时一个不带装饰器参数的类装饰器和函数就定义好了, 接下来我们看看执行结果:

http://img4.sycdn.imooc.com/5fb76e950001d88504020110.jpg

http://img1.sycdn.imooc.com/5fb76eb5000171fe02040072.jpg

(4) 结果分析: 我们执行了test_a 传入一个字符串,执行, 我们会发现触发了 类中的 call, 并且先执行了a_test.


接下来我们看一下 2 带参数的类装饰器的写法和用法, 依然还是看图说话

http://img3.sycdn.imooc.com/5fb76f4c0001fd1e06310526.jpg

分析:

(1) 我们整体结构 和 上一个列子差不多, 依然是定义一个类,并且定义一个 构造函数和 call函数, 不过区别在于, 在init函数中, 我们定义的是类装饰器需要的参数, 比如 截图中的name, 而我们需要传入的执行函数抛到了call函数中, 而在call函数中, 我们定义一个局部函数wrapper, 这个用法是不是就和 传图的函数装饰器一样了呢?

(2) 定义完了类装饰器, 我们来定义函数test_b, 在这里我们定义一个参数age, 将类装饰器放在test_b之上并添加刚才定义在init中的参数name, 这样就完成了定义, 那么我们来看下执行和结果:

http://img3.sycdn.imooc.com/5fb770190001a9ce03010080.jpg

http://img4.sycdn.imooc.com/5fb7703a0001107b01530057.jpg

(3) 结果分析, 我们看到 一个dewei, 一个33, dewei是通过类装饰器的参数传进去覆盖了默认参数muke, 而33是test_b函数本身的参数, 被打印出来了.


总结:

以上就是python类装饰器的使用方法, 是不是非常简单, 这里在2中使用了 函数wraps, 通过

from functools import wraps 调用, 他具体做什么的? 大家可以自行查一查.  至于说类装饰器, 我本人还是很喜欢的,因为如果在开发比较复杂的装饰器的时候, 将多个有关联的功能放到一个类中, 更好维护也更易读. 所以我个人建议简单的装饰器我们就用函数装饰器, 复杂的我们就使用类装饰器来完成即可.

 好了, 那么今天的手记就到这里了.


··································

欢迎关注课程:

《Django入门到进阶-更适合Python小白的系统课程》

  金职位 Python工程师2020版


打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP