python 类装饰器和函数装饰器区别_python 类装饰器的用法

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

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

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

2: 带参数的装饰器用法

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

分析:

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

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

分析:

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

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

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

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

总结:

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

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

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

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

欢迎关注课程:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值