前言
前文我们分析了函数装饰器、类装饰器,当时这些装饰器都是用来装饰函数的,实际上对象的创建也是一个函数调用的过程,当装饰器与类相遇时也可以碰撞出独特的火花。
准备
想要探究这个有趣的问题,我们需要一些对象创建过程的知识。
运行结果:
__new__ is called.
__init__ is called.
从结果可以看出,当我们实例化一个对象的时候,首先会调用__new__方法,该方法会实例化一个对象;其次会调用__init__方法,做一些初始化的工作。
我们仔细看一下实例化的调用:
a = Bird()
这非常像一个函数的调用(内部也确实是一个函数调用),我们可以考虑用装饰器来修饰该过程,从而控制对象的创建。
探索
运行结果:
Pre object creation.
__new__ is called.
__init__ is called.
Post object creation.
可以看到,我们确实已经在类实例化前后成功的插入新的功能。
装饰过程:Bird = decorate(Bird)
实例化过程:Bird() => deocrate(Bird)() => wrapper()
那在这样的装饰器中我们又能做什么呢?仔细看一下我们装饰器的定义:
从代码中我们可以看出,我们可以获得类和实例化对象的所有信息,基于这些信息,我们能实现一些非常实用的功能,例如,统计实例化对象的个数,提取对象的属性等,后文我会介绍一些装饰器的典型应用。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!