hello, 大家好, 好久不写python手记了, 之前有幸 录制了 金职位 Python工程师2020版 课程的 入门课程. 在这套课程中, 讲解了 python中的装饰器的用处以及函数装饰器的入门用法. 但是对于装饰器来说, python 还有更高级的用法(也不能说是高级吧, 应该说是另外的用法)----类装饰器的定义和使用. (当然如果基础还没有打捞, 建议去看 金职位 Python工程师2020版 ?)
本手记 我们 分2中类装饰器的用法:
1: 不带参数的装饰器用法
2: 带参数的装饰器用法
好, 那么我们先从1开始, 我们先上图, 看图说话:
分析:
(1)我们定义了一个 A 类, 在这里 我们定义里 构造函数 init, 并且将 被装饰器调用的函数传入, 并给予 self.func,
(2)接下来, 我们定义__call__ 将被装饰器调用函数的参数传入(我们在基础课程中有讲过call的含义, 这里就不再解释了), 我们可以在__call__函数中再添加装饰器逻辑, 比如验证些什么, 或者对 func返回的结果做处理等等(只要是你业务逻辑需要的)
(3) 好, 定义好了一个 A类,后我们定义一个函数 test_a, 并且将A类以为装饰器的形式放在test_a的上边. 此时一个不带装饰器参数的类装饰器和函数就定义好了, 接下来我们看看执行结果:
(4) 结果分析: 我们执行了test_a 传入一个字符串,执行, 我们会发现触发了 类中的 call, 并且先执行了a_test.
接下来我们看一下 2 带参数的类装饰器的写法和用法, 依然还是看图说话
分析:
(1) 我们整体结构 和 上一个列子差不多, 依然是定义一个类,并且定义一个 构造函数和 call函数, 不过区别在于, 在init函数中, 我们定义的是类装饰器需要的参数, 比如 截图中的name, 而我们需要传入的执行函数抛到了call函数中, 而在call函数中, 我们定义一个局部函数wrapper, 这个用法是不是就和 传图的函数装饰器一样了呢?
(2) 定义完了类装饰器, 我们来定义函数test_b, 在这里我们定义一个参数age, 将类装饰器放在test_b之上并添加刚才定义在init中的参数name, 这样就完成了定义, 那么我们来看下执行和结果:
(3) 结果分析, 我们看到 一个dewei, 一个33, dewei是通过类装饰器的参数传进去覆盖了默认参数muke, 而33是test_b函数本身的参数, 被打印出来了.
总结:
以上就是python类装饰器的使用方法, 是不是非常简单, 这里在2中使用了 函数wraps, 通过
from functools import wraps 调用, 他具体做什么的? 大家可以自行查一查. 至于说类装饰器, 我本人还是很喜欢的,因为如果在开发比较复杂的装饰器的时候, 将多个有关联的功能放到一个类中, 更好维护也更易读. 所以我个人建议简单的装饰器我们就用函数装饰器, 复杂的我们就使用类装饰器来完成即可.
好了, 那么今天的手记就到这里了.
··································
欢迎关注课程:
《Django入门到进阶-更适合Python小白的系统课程》