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

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


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

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

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

● 简单几步,100行代码用Python画一个蝙蝠侠的logo

● 我用Python分析了《青春有你2》109位漂亮小姐姐,真香!

● 牛逼操作!用Python做了一个编程语言20年的动态排行榜!

● 我打赌,学会这6招,谁再敢笑你的Python程序慢!

每天分享一些有趣的干货

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值