知行编程网知行编程网  2022-04-30 10:00 知行编程网 隐藏边栏 |   抢沙发  3 
文章评分 0 次,平均分 0.0

Python面试经常问的单例模式,5分钟带你拿下!

Python面试中经常会问到单例模式,面试官主要是为了深入考察你的类的知识,单例模式比较特殊也算是经典的设计模式之一,但是在实际的生产环境并不经常用到

面试的时候,如果你不提前准备,一定会比较尴尬;有的甚至要求你当场手写出来,功底不深的,很容易当场就懵逼了!其实也不是很难,今天小编就带大家5分钟来拆解一下,看完之后你就会冒出一句"单例模式,哎呦不错哦"



01.先弄清一个问题的,类的初始化和创建


有的人这个还不简单啊,类的初始化不就是init嘛,那类的创建呢,是不是也是init呢。我们先来看一个例子:

Python面试经常问的单例模式,5分钟带你拿下!

>>

This is __new__: 1

This is __init__: 1


上面两个都是魔法函数,一个类的对象的创建的过程是先运行__new__,再运行__init__。准确的说new函数负责创建这个对象的instance,而init是初始化这个实例。



02.什么是单例模式


好明白了上面的原理之后,我们来讲一下单例模式,什么是单例子模式呢,简单说就是一个类只能用一个实例,知乎上有一个很经典的段子描述单例模式,就是不管你遇到多少个女神,你只能有一个老婆,你的老婆是唯一的


那问题来了,如何才能让一个类在创建的时候只能创建一个实例呢,我们用源码来表述一下:

Python面试经常问的单例模式,5分钟带你拿下!

>>

我的老婆是: 小美


对不起小幂,我已经有老婆小美了,你不是我的老婆!

我的老婆是: 小美


真的是一见钟情啊,痴情汉!遇到小美,就产生了一个对象,我的老婆是小美;当再遇到小幂的时候,就跟她说,对不起,我已经有老婆啦!


我们从程序的角度来解释一下:

我们声明两个全局的变量,类变量,一个是来记录唯一的实例,一个是记录是否第一次初始化。

<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,你已经是已婚人士啦!


这样的话等到再来创建对象的时候,因为有这两个全局的记录值,就很容易把你的小二,小三都拒之门外啦。


当然除了上面的表述方法,还可以用装饰器来解决:

Python面试经常问的单例模式,5分钟带你拿下!

>>

我的老婆是: 小美

我的老婆是: 小美


是不是看上去有点骚包,很花俏,其实装饰器看似很难,一旦用爽了就很爽。我们构造一个装饰器,里面的instance其实也是全局的,如果懂闭包就会明白。这里声明为一个字典,利用它的key的唯一性。这里的cls其实就是类初始化后的instance的地址,不行你可以id(cls)。




5分钟带你了解单例模式,希望通过这篇大家能更理解类的用法,是不是又能学到一招,你觉得呢,欢迎留言吱一声!



Python面试经常问的单例模式,5分钟带你拿下!

● 80%的人都不知道,全球Python库下载前10名

● 我珍藏的一些好的Python代码,技巧|上篇

● 爬取300本Python书籍,用Python告诉你哪家强?

● 简单几步,100行代码用Python画一个蝙蝠侠的logo
● 我用Python分析了《青春有你2》109位漂亮小姐姐,真香!
● 牛逼操作!用Python做了一个编程语言20年的动态排行榜!
● 我打赌,学会这6招,谁再敢笑你的Python程序慢!


Python面试经常问的单例模式,5分钟带你拿下!
每天分享一些有趣的干货


本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享