面向对象9--元类之单例模式
1>自定义元类控制类的实例化行为
1.1> 储备知识之 __call__方法
先看下定义一类,有和没有__call__方法是,调用该类实例化的对象时的情况,如下:
谨记:一定是在调用对象时会自动触发执行__call__方法
既然有__call__方法就可以被调用,那么类也就是元类实例化出来的对象,是否说明元类也存在__call__方法?
1.2> 自定义元类,控制类的实例化过程
首先回顾下之前说的类的实例化过程:1、产生一个空对象;2、调用类的__init__函数,初始化对象属性;3、返回这
个对象;
所以,__call__至少也应该包含这三步,
1、产生一个空对象,可以用 obj=object.__new__() 实现
2、初始化对象,self.__init(obj, *args, **kwargs)
3、返回对象, return obj
一定要记住返回obj,因为实例化A得到的就是__call__的返回值
自定义之前,先看下之前的类的实例化过程,以及对象的字典,如下
如上,初始化的时候,第一个参数也就是self,肯定就是对象自己
2>自定义元类控制类的实例化行为的应用-----单例模式
先看个例子,简单了解下 单例模式
那么怎么通过元类来实现 单例模式呢,我们都知道,实例化,其实就是触发__call__方法的执行,
所以,肯定还是要在__call__方法里面做文章了。
思路:首先想到,既然不能一直实例化,肯定要加判断逻辑了,哪些情况需要执行__call__方法,
哪些情况就不执行,直接返回对象?
更改如下: