面向对象9--元类之单例模式

1>自定义元类控制类的实例化行为

    1.1> 储备知识之 __call__方法

    先看下定义一类,有和没有__call__方法是,调用该类实例化的对象时的情况,如下:

    面向对象9--元类之单例模式

    谨记:一定是在调用对象时会自动触发执行__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__的返回值
    
    自定义之前,先看下之前的类的实例化过程,以及对象的字典,如下

    面向对象9--元类之单例模式

    如上,初始化的时候,第一个参数也就是self,肯定就是对象自己

    面向对象9--元类之单例模式

2>自定义元类控制类的实例化行为的应用-----单例模式

    先看个例子,简单了解下 单例模式

    面向对象9--元类之单例模式

    那么怎么通过元类来实现 单例模式呢,我们都知道,实例化,其实就是触发__call__方法的执行,

    所以,肯定还是要在__call__方法里面做文章了。

    

    思路:首先想到,既然不能一直实例化,肯定要加判断逻辑了,哪些情况需要执行__call__方法,
    哪些情况就不执行,直接返回对象?
    更改如下:
    面向对象9--元类之单例模式