前几天写了一篇Python设计模型花5分钟,菜鸟也能学一个设计模式|简单工厂,有不少小伙伴留言,有人建议讲讲单例模式。单例模式的应用场景非常特殊,但是对我们深入理解Python类非常有帮助.
01.先弄清一个问题的,类的初始化和创建
有的人这个还不简单啊,类的初始化不就是init嘛,那类的创建呢,是不是也是init呢。我们先来看一个例子:
>>
This is __new__: 1
This is __init__: 1
上面两个都是魔法函数,一个类的对象的创建的过程是先运行__new__,再运行__init__。准确的说new函数负责创建这个对象的instance,而init是初始化这个实例。
02.什么是单例模式
好明白了上面的原理之后,我们来讲一下单例模式,什么是单例子模式呢,简单说就是一个类只能用一个实例,知乎上有一个很经典的段子描述单例模式,就是不管你遇到多少个女神,你只能有一个老婆,你的老婆是唯一的。
那问题来了,如何才能让一个类在创建的时候只能创建一个实例呢,我们用源码来表述一下:
>>
我的老婆是: 小美
对不起小幂,我已经有老婆小美了,你不是我的老婆!
我的老婆是: 小美
真的是一见钟情啊,痴情汉! 遇到小美,就产生了一个对象,我的老婆是小美;当再遇到小幂的时候,就跟她说,对不起,我已经有老婆啦!
我们从程序的角度来解释一下:
我们声明两个全局的变量,类变量,一个是来记录唯一的实例,一个是记录是否第一次初始化。
<span style="font-size: 15px;">__instance<span style="font-size: 15px;color: rgb(249, 38, 114);">=</span><span style="font-size: 15px;color: rgb(102, 217, 239);font-style: italic;">None<br /></span>__is_first_init<span style="font-size: 15px;color: rgb(249, 38, 114);">=</span><span style="font-size: 15px;color: rgb(102, 217, 239);font-style: italic;">False</span></span>
每次类创建对象的时候,我们都对它进行判断。如果是第一次创建,我们就在new里面把实例初始化,并且__instance赋值记录。而对应把你一见钟情的老婆也记录__is_first_init为True,你已经是已婚人士啦!
这样的话等到再来创建对象的时候,因为有这两个全局的记录值,就很容易把你的小二,小三都拒之门外啦。
当然除了上面的表述方法,还可以用装饰器来解决:
>>
我的老婆是: 小美
我的老婆是: 小美
是不是看上去有点骚包,很花俏,其实装饰器看似很难,一旦用爽了就很爽。我们构造一个装饰器,里面的instance其实也是全局的,如果懂闭包就会明白。这里声明为一个字典,利用它的key的唯一性。这里的cls其实就是类初始化后的instance的地址,不行你可以id(cls)。
5分钟学设计模式,希望通过这篇大家能更理解类的用法,是不是又能学到一招,你觉得呢,欢迎留言吱一声!
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在python中做极坐标11/03
- ♥ 吃瓜群众,我用五行Python代码让微博热点动起来!06/02
- ♥ 如何用python3输出打印变量?12/27
- ♥ python3安装失败如何处理12/11
- ♥ python2.7安装扭曲错误如何解决11/11
- ♥ 为什么推荐你学习 Python?10/22
内容反馈