面试必问的单例模式究竟是什么鬼有哪些

很多面试python初级岗位的同学,有大概率会被问到单例模式,而且一般都会现场让你写一个单例。可是有很多同学可能不是很理解,甚至专门把代码背下来,说实话,有点不靠谱。本文将基于python分享单例模式的那点事,希望对你有所帮助放假啦!

01官方定义

单例是一种设计模式,应用该模式的类只会生成一个实例。单例模式保证了在程序的不同位置都可以且仅可以取到同一个对象实例:如果实例不存在,会创建一个实例;如果已存在就会返回这个实例。因为单例是一个类,所以你也可以为其提供相应的操作方法,以便于对这个实例进行管理

02个人理解

举个例子来说:类可以看作固定的一块地,类的实例化对象就是这个土地的使用每个建造师给一块土地,要求是:只能在分配的土地上造房子,怎么造不管。也就是说,第一次房子造好了,后面怎么改,都是在这块土地上对这个房子进行改造。如果他对房子不满意,重新造房子还是在这块土地上建造……也就是说,不管这个建筑师怎么折腾,折腾的都是这片土地。(简单来讲,单例模式下,实例一旦生成,永远都驻扎在内存中的同一个地址,所以怎么改都是改该位置上的对象)

03单例模式的作用

全局变量,我相信大伙都不陌生吧。全局变量一般在项目中的作用,是根据某个动作是否完成做出相应的操作。一般开始都有个默认值,如果完成了,将默认值更改,如果没完成,继续执行单例也是为了达到这个目的,允许你在程序的任何地方访问这个对象,且提供了更为全面的属性和方法,让你可以在设计类时,完美地实现这个特殊的全局变量。单例模式吸收了全局变量的优点,摒弃了全局变量的缺点,如果要考虑使用全局变量控制程序的业务逻辑,可以考虑使用单例模式。

04单例模式的不足

单例类如果使用继承,子类实例化可能会出现问题单例类不是特别好扩展,因为一般没有抽象层

05单例模式的几种实现

1.python模块就是天然的单例模式因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了代码如下模块中的单例用以下的方法导入就算做是单例的使用了导入即可2.使用__new__方法网络上提到的最多的实现的手段,不再多做介绍,直接上代码3.使用元类元类可以说是python中最难理解的点了,简单的描述下:首先每一个类默认的元类是type类,默认的基类是object类,这两个是有区别的默认情况下,类的创建(注意:不是实例!)会默认执行type类的__init__方法如果对一个既指定元类和又指定基类的类来说,实例化这个类的步骤为:1.执行元类的__call__方法,然后执行基类的__new__方法,最后才会执行此类的__init__方法代码如下代码借鉴自cookbook当然,单例的实现不仅仅只有这几种方法,剩下的你可以自己去探索一下了,毕竟知识嘛,还是要自己主动些。本篇完!我是一名奋战在编程界的pythoner,工作中既要和数据打交道,也要和erp系统,web网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎


转载请注明:http://www.aierlanlan.com/rzgz/7379.html