Python面试中经常会问到单例模式,面试官主要是为了深入考察你的类的知识,单例模式比较特殊也算是经典的设计模式之一,但是在实际的生产环境并不经常用到。
面试的时候,如果你不提前准备,一定会比较尴尬;有的甚至要求你当场手写出来,功底不深的,很容易当场就懵逼了!其实也不是很难,今天小编就带大家5分钟来拆解一下,看完之后你就会冒出一句"单例模式,哎呦不错哦"
01.先弄清一个问题的,类的初始化和创建
有的人这个还不简单啊,类的初始化不就是init嘛,那类的创建呢,是不是也是init呢。我们先来看一个例子:
>>
This is __new__: 1
This is __init__: 1
上面两个都是魔法函数,一个类的对象的创建的过程是先运行__new__,再运行__init__。准确的说new函数负责创建这个对象的instance,而init是初始化这个实例。
02.什么是单例模式
好明白了上面的原理之后,我们来讲一下单例模式,什么是单例子模式呢,简单说就是一个类只能用一个实例,知乎上有一个很经典的段子描述单例模式,就是不管你遇到多少个女神,你只能有一个老婆,你的老婆是唯一的。
那问题来了,如何才能让一个类在创建的时候只能创建一个实例呢,我们用源码来表述一下:
>>
我的老婆是: 小美
对不起小幂,我已经有老婆小美了,你不是我的老婆!
我的老婆是: 小美
真的是一见钟情啊,痴情汉!遇到小美,就产生了一个对象,我的老婆是小美;当再遇到小幂的时候,就跟她说,对不起,我已经有老婆啦!
我们从程序的角度来解释一下:
我们声明两个全局的变量,类变量,一个是来记录唯一的实例,一个是记录是否第一次初始化。
__instance=None
__is_first_init=False
每次类创建对象的时候,我们都对它进行判断。如果是第一次创建,我们就在new里面把实例初始化,并且__instance赋值记录。而对应把你一见钟情的老婆也记录__is_first_init为True,你已经是已婚人士啦!
这样的话等到再来创建对象的时候,因为有这两个全局的记录值,就很容易把你的小二,小三都拒之门外啦。
当然除了上面的表述方法,还可以用装饰器来解决:
>>
我的老婆是: 小美
我的老婆是: 小美
是不是看上去有点骚包,很花俏,其实装饰器看似很难,一旦用爽了就很爽。我们构造一个装饰器,里面的instance其实也是全局的,如果懂闭包就会明白。这里声明为一个字典,利用它的key的唯一性。这里的cls其实就是类初始化后的instance的地址,不行你可以id(cls)。
5分钟带你了解单例模式,希望通过这篇大家能更理解类的用法,是不是又能学到一招,你觉得呢,欢迎留言吱一声!