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

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 Config 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 Config 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 Config 这样的类,我们希望在程序运行期间只存在一个实例对象,而且在我们目前的程序中也确实是通过单例来实现的这个功能,是通过__new__的方式来实现的。

然后是对单例模式的一个实现和验证:

单例模式的实现可以有多种形式:

·使用模块

·使用__new__

·使用装饰器(decorator)

·使用元类 —— 后面看元类的内容

(1)直接使用模块实现:

可以新创建一个文件testdanlimoshibymokuai.py,例如:

#coding=utf-8

class my_Singleton(object):

def foo(self):

print '111'

mysingleton = my_Singleton()

之后在另外一个文件中进行调用,如下:

可以看到结果:

(2)使用__new__实现:

class Singleton(object):

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

if not hasattr(cls, '_instance'):

cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)

return cls._instance

class notSingleton(object):

def __init__(self):

pass

结果验证:

if __name__ == "__main__":

#下面是单例的情况

a1 = Singleton()

a2 = Singleton()

print id(a1)

print id(a2)

#下面是非单例的情况

a4 = notSingleton()

a5 = notSingleton()

print id(a4)

print id(a5)

结果为:

关于上面实现中具体用到的id()和hasattr(),具体含义如下:

使用装饰器:

#用装饰器实现的单例

def Singleton2(cls):

instances = {}

@wraps(cls)

def wrapper(*args, **kw):

if cls not in instances:

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

return instances.get(cls, None)

return wrapper

@Singleton2

class testClass(object):

def __init__(self):

self.value = 1

验证结果:

得到的结果是:

备注:为什么是__new__,__new__的作用是什么?和__init__的区别是什么?还有看到__call__的,这个又是用来做什么的?

另外,__双划线,和_单划线的这种,有什么区别?

下面是关于以上几个问题的答案:

1、__new__代表的含义是:在新式类中,才有__new__,这个其实才是构造函数,创建实例,返回类的实例对象,__init__则进行参数等的设置和丰富,就是当对象被创建初始化的时候使用的

class Test1(object):

def __init__(self):

self.value = 1

class Test2(object):

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

return object.__new__(Other, *args, **kwargs)

def __init__(self):

self.value = 1

class Other(object):

pass

打印type来确定一下:

t1 = Test1()

print type(t1)

t2 = Test2()

print type(t2)

可以看到结果如下:

其实是因为在Test2中__new__进行了重载,这里返回的是Other类的实例对象,那么Other类本身

如果我们想要查看设置的value值,则可以通过下方代码:

t1 = Test1()

print type(t1)

print t1.value

t2 = Test2()

print type(t2)

print t2.value

结果如下:

修改成下面这样的形式:

再执行语句就可以得到这个结果:

后面需要再了解一下:如何给类设置属性、增加属性、删除属性。。。。。

2、关于__xxx__、_xxx 和 __xxx的不同之处在于:参考文章:http://blog.csdn.net/li_101357/article/details/52794164

首先给出各自含义,然后再结合实际例子进行理解:

__xxx__:代表系统定义名字

_xxx:保护变量,

__xxx:类中的私有变量名

参考文章:http://python.jobbole.com/87294/

【python深入】单例模式的更多相关文章

  1. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  2. Python 基于python实现单例模式

    基于python实现单例模式 by:授客 QQ:1033553122   概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...

  3. python 以单例模式封装logging相关api实现日志打印类

    python 以单例模式封装logging相关api实现日志打印类   by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   实现功能: 支持自由配置,如下lo ...

  4. python的单例模式:

    python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...

  5. 【Python】单例模式Singleton

    前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...

  6. 浅谈Python设计模式 - 单例模式

    本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...

  7. 【python】Python的单例模式

    原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...

  8. python实现单例模式

    有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存. 那我们就可以想,我们拿到一次数 ...

  9. Python 实现单例模式的一些思考

    一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...

  10. python之单例模式、栈、队列和有序字典

    一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...

随机推荐

  1. EtherCAT 要点

    倍福: 1.倍福的每个从站模块(IO模块)一般都有转换时间而这些时间会导致从站模块输出数值存在延迟,举例:当在15:00开始调用API让主站板卡输出数据,而用示波器实际检测到模块输出数值的时间大约在1 ...

  2. 全志A33 lichee 修改开机图片

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 首先要知道开机图片存在哪里? ...

  3. ubuntu16.04下怎么关闭x server

    按住ctrl+alt+f1,进入命令行. 输入sudo /etc/init.d/lightdm stopsudo /etc/init.d/lightdm status 重启xserver?输入sudo ...

  4. 使用JAVA实现的一个简单IOC注入实例

    https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...

  5. 【C++】vector内存机制和性能分析

    转自:https://blog.csdn.net/mfcing/article/details/8746256 一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用 ...

  6. EXCEL统计不重复值的数量

    如这一列中,有多少不重复值? 1.可以点击,数据,删除重复项,清除重复值,然后剩下的统计一下即可知道:       ===> 2.用公式:=SUMPRODUCT((MATCH(E3:E20,E3 ...

  7. 12月中旬项目中出现的几个bug解决方法的思考

    这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰.还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问 ...

  8. 几种流行Webservice框架

    一. 几个比较流行的Webservice框架: Apache Axis1.Apache Axis2.Codehaus XFire.Apache CXF.Apache Wink.Jboss  RESTE ...

  9. 4th Dec 2018

    两个人都觉得自己没错,或者对方都把错误归结于另外一方,总会盯着对方的不足,无限放大:谁都不肯先放下兵器,亦或害怕自己放下了兵器,对方又拿起了盾.这就好像双方在同一时间拉扯一根皮筋,拉扯的越长,张力越大 ...

  10. ORA-03137: TTC 协议内部错误: [12333] [4] [49] [51] [] [] [] []

    [1]问题背景:Oracle数据库版本为11.2.0.1,操作系统CentOS release 5.9,详细的报错信息如下: Dump file /data/oracle/diag/rdbms/db0 ...