Python 面试题:单例的四种实现方式

栏目: 后端 · 发布时间: 6年前

内容简介:点击蓝色字关注我们!

点击蓝色字关注我们!

Python 面试题:单例的四种实现方式

   

如何在 Python 中实现单例模式,是面试编码环节时比较常见的题目了,这里我们介绍四种实现方式。

  • 1.使用装饰器

  • 2.使用基类

  • 3.使用元类

  • 4.使用模块 

定义

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中某个类只能出现一个实例时,单例对象就能派上用场。

应用场景:

  • 1. 网站的计数器:程序内一般采用单例模式,否则难以同步

  • 2. Web应用的配置对象的读取:配置文件是共享资源

  • 3. 多线程的线程池:一般也是采用单例模式 

1. 装饰器模式

使用装饰器来实现单例模式也是python的经典面试题,可以一道简单的题目同时考察装饰器的理解和单例的实现。

装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例 


 

def singleton(cls, *args, **kw):

instances = {}


def _singleton():

if cls not in instances:

instances[cls] = cls(*args, **kw)

return instances[cls]


return _singleton



@singleton

class MyClass4(object):

a = 1


def __init__(self, x=0):

self.x = x



one = MyClass4()

two = MyClass4()


two.a = 3

print one.a

  • 优点:相比多重继承来说,使用装饰器会更加直观,更pythonic,更elegant的方法

  • 缺点:当你实例化Myclass的时候,得到的其实是singleton对象,是一个方法,而不是类,所以没办法使用类的本身的属性

2.使用基类


 

class Singleton(object):

_instance = None

def __new__(class_, *args, **kwargs):

if not isinstance(class_._instance, class_):

class_._instance = object.__new__(class_, *args, **kwargs)

return class_._instance


class MyClass(Singleton, BaseClass):

pass

  • 优点:一个真正的类

  • 缺点:多重继承,new可能会被重写。 

3. 使用元类

元类(metaclass)可以控制类的创建过程,它主要做三件事:

  • 拦截类的创建

  • 修改类的定义

  • 返回修改后的类 


 

class Singleton(type):

_instances = {}

def __call__(cls, *args, **kwargs):

if cls not in cls._instances:

cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)

return cls._instances[cls]


#Python2

class MyClass(BaseClass):

__metaclass__ = Singleton


#Python3

class MyClass(BaseClass, metaclass=Singleton):

pass

  • 优点:是一个真正的类,自动覆盖继承,合理使用了metaclass

  • 缺点:暂无

4. 使用模块

其实Python的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件, 当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。 


 

class MySingleton(object):

def foo(self):

pass


mySingleton = MySingleton()



# 将上面的代码保存在文件 mysingleton.py 中,然后这样使用:


from mysingleton import mySingleton


mySingleton.foo()

  • 优点:方便,简单

  • 缺点:有人说在python中实现单例模式到底有没有意义,module本身就是单例导入,在一些场景下考虑单例其实是没有必要的....

   

Python 面试题:单例的四种实现方式

长按识别

关注 技术90分

Python 面试题:单例的四种实现方式


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML5与CSS3基础教程(第8版)

HTML5与CSS3基础教程(第8版)

[美] Elizabeth Castro、[美] Bruce Hyslop / 望以文 / 人民邮电出版社 / 2014-5 / 69.00元

本书是风靡全球的HTML和CSS入门教程的最新版,至第6版累积销量已超过100万册,被翻译为十多种语言,长期雄踞亚马逊书店计算机图书排行榜榜首。 第8版秉承作者直观透彻、循序渐进、基础知识与案例实践紧密结合的讲授特色,采用独特的双栏图文并排方式,手把手指导读者从零开始轻松入门。相较第7版,全书2/3以上的内容进行了更新,全面反映了HTML5和CSS3的最新特色,细致阐述了响应式Web设计与移......一起来看看 《HTML5与CSS3基础教程(第8版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具