python 类装饰器的用法

deweizhang 2020/11/21 8:24:52

hello, 大家好, 好久不写python手记了, 之前有幸 录制了 金职位 Python工程师2020版 课程的 入门课程. 在这套课程中, 讲解了 python中的装饰器的用处以及函数装饰器的入门用法. 但是对于装饰器来说, python 还有更高级的用法(也不能说是高级吧, 应该说是另外的用法)---…

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版


随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[python 类装饰器的用法]http://www.zyiz.net/tech/detail-149211.html

上一篇:聊一聊python和golang的协程区别

下一篇:掌握Python可以去哪些岗位?薪资如何?

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程