单例模式(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深入】单例模式的更多相关文章
-
python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
-
Python 基于python实现单例模式
基于python实现单例模式 by:授客 QQ:1033553122 概念 简单说,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也 ...
-
python 以单例模式封装logging相关api实现日志打印类
python 以单例模式封装logging相关api实现日志打印类 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7 实现功能: 支持*配置,如下lo ...
-
python的单例模式:
python的单例模式:http://funhacks.net/2017/01/17/singleton/ https://www.cnblogs.com/huchong/p/8244279.html ...
-
【Python】单例模式Singleton
前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...
-
浅谈Python设计模式 - 单例模式
本篇主要介绍一下关于Python的单例模式,即让一个类对象有且只有一个实例化对象. 一.使用__new__方法(基类) 要实现单例模式,即为了让一个类只能实例化一个实例,那么我们可以去想:既然限制创建 ...
-
【python】Python的单例模式
原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...
-
python实现单例模式
有这么一种场景,我们把数据封装到类体或类的某个方法里,然而我们new出这个类只是为了拿到这部分数据,那么当多次这样调用的时候,每次都来拿数据并放到内存中大大浪费了内存. 那我们就可以想,我们拿到一次数 ...
-
Python 实现单例模式的一些思考
一.问题:Python中如何实现单例模式 单例模式指一个类只能实例化一个对象. 二.解决方案: 所有资料参考于: http://python.jobbole.com/87294/ https://ww ...
-
python之单例模式、栈、队列和有序字典
一.单例模式 import time import threading class Singleton(object): lock = threading.RLock() # 定义一把锁 __inst ...
随机推荐
-
【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Statu ...
-
统一回复《怎么学JavaScript?》
作者:小不了链接:https://zhuanlan.zhihu.com/p/23265155来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 鉴于时不时,有同学私信问我( ...
-
Spring 中 Xml配置文件属性的说明
Xml配置文件属性的说明: <bean id="TheAction" ⑴ class="net.xiaxin.spring.qs.UpperAction" ...
-
一步步教你如何把电脑设置U盘启动(图解教程)
一.我们先来说说如何进入 BIOS设置程序: 在开机时按下特定的热键可以进入BIOS设置程序,不同类型的机器进入BIOS设置程序的按键不同,有的在屏幕上给出提示,有的不给出提示,几种常见的BIOS设置 ...
-
【Xamarin开发 Android 系列 6】 Android 结构基础(上)
原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...
-
android获取设备屏幕大小的方法
// 通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay( ...
-
java的JCombobox实现中国省市区三级联动
源代码下载:点击下载源代码 用xml存储中国各大城市的数据. xml数据太多了就不贴上了,贴个图片: 要解释xml,添加了一个jdom.jar,上面的源代码下载里面有. 解释xml的类: packag ...
-
OpenCV手写数字字符识别(基于k近邻算法)
摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...
-
寒假特训——I - Fair
Some company is going to hold a fair in Byteland. There are nn towns in Byteland and mm two-way road ...
-
扩容Linux文件系统
扩容Linux文件系统 腾讯云 云硬盘扩容 https://cloud.tencent.com/product/cbs https://cloud.tencent.com/document/produ ...