花5分钟,菜鸟也能学个设计模式|单例模式

来自:菜鸟学Python(微信号:cainiao_xueyuan),作者:Leoxin


前几天写了一篇Python设计模型花5分钟,菜鸟也能学一个设计模式|简单工厂,有不少小伙伴留言,有人建议讲讲单例模式。单例模式的应用场景非常特殊,但是对我们深入理解Python类非常有帮助.



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)。

推荐↓↓↓
程序员的那点事
上一篇:使用Mock框架JMockit进行单元测试 下一篇:作为程序员,要保持工作和家庭平衡,就那么难么?