python单例模式实例分析


Posted in Python onApril 08, 2015

本文实例讲述了python单例模式。分享给大家供大家参考。具体分析如下:

__new__()在__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例化1个对象。 

class Singleton(object):
  __instance=None
  def__init__(self): 
    pass
  def__new__(cls,*args,**kwd):
    if Singleton.__instance is None: 
      Singleton.__instance=object.__new__(cls,*args,**kwd)
    return Singleton.__instance

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。

在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

一些资源管理器常常设计成单例模式。

在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。

需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。

需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管理,不可政出多头。

这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。

优点:

一、实例控制

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

二、灵活性

因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点:

一、开销

虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

二、可能的开发混淆

使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

三、对象生存期

不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
Python返回数组/List长度的实例
Jun 23 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
在Docker上部署Python的Flask框架的教程
Apr 08 #Python
python threading模块操作多线程介绍
Apr 08 #Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 #Python
python中Genarator函数用法分析
Apr 08 #Python
探索Python3.4中新引入的asyncio模块
Apr 08 #Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 #Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 #Python
You might like
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
2014/11/14 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
js实现电灯开关效果
2021/01/19 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
Python守护线程用法实例
2017/06/23 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
python中open函数的基本用法示例
2019/09/07 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
营销与策划个人求职信
2013/09/22 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
给学校的建议书
2014/03/12 职场文书
工作鉴定评语
2014/05/04 职场文书
2014年中秋寄语
2014/08/11 职场文书
幸福中国演讲稿
2014/09/12 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
python实现简单倒计时功能
2021/04/21 Python
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android