python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
单例:一个类只能生成唯一的一个实例
每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗
对
#方法1,实现__new__方法
#并在将一个类的实例绑定到类变量_instance上,
#如果cls._instance为None说明该类还没有实例化过,则实例化该类,并返回实例对象
#如果cls._instance不为None,直接返回已经实例化了的实例对象
cls._instance
#super(Singleton, cls)是object 的意思
#coding=utf-8
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
#cls._instance = object.__new__(cls, *args, **kw) #等价上一句
return cls._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a
#3
#one和two完全相同,可以用id(), ==, is检测
print id(one)
#40579184
print id(two)
#40579184
print one == two
#True
print one is two
#True
c:\Python27\Scripts>python task_test.py
3
40579184
40579184
True
True
程序解释:
#coding=utf-8
class Singleton(object):
def __new__(cls, *args, **kw):
if not 判断此类是否存在类变量_instance“”
如果不存在,则生成一个Singleton的实例
并且赋值给类变量_instance
下面返回类变量中保存的实例对象
return cls._instance
#coding=utf-8
class Singleton(object):
def __new__(cls, *args, **kw):
#如果不存在类变量_instance,则执行if下的子句
if not hasattr(cls, '_instance'):
#下面两句,表示使用object.__new__方法生成了Singleton的一个实例
#super(Singleton, cls)是object 的意思
orig = super(Singleton, cls)#这句参考下边的调用基类构造方法,没有后边的.__init…,
#应该就是表示基类object,只不过是把类名赋值给orig了
cls._instance = orig.__new__(cls, *args, **kw)#从下边可以看到改成
#cls._instance = object.__new__(cls, *args, **kw),结果是一样的
#返回类对象中保存的实例对象
return cls._instance
‘’’
#调用基类构造方法例子
class C(A):
def
__init__(self):
super(C,self).__init__()#调用基类构造方法
‘’’
c:\Python27\Scripts>python
task_test.py
3
40403056
40403056
True
True
改成另一种调用基类__new__的方法:
#coding=utf-8
class Singleton(object):
def
__new__(cls,*args,**kw):
if not
hasattr(cls,'_instance'):
#orig=super(Singleton,cls)
cls._instance=object.__new__(cls,*args,**kw)
return
cls._instance
class MyClass(Singleton):
a=1
one=MyClass()
two=MyClass()
two.a=3
print one.a
print id(one)
print id(two)
print one==two
print one is two
c:\Python27\Scripts>python
task_test.py
3
41189456
41189456
True
True
后期添加注释代码:
#coding=utf-8
class Singleton(object):
def
__new__(cls,*args,**kw):
if not
hasattr(cls,'_instance'):
orig=super(Singleton,cls)
cls._instance=orig.__new__(cls,*args,**kw)
#打印返回:type
<class '__main__.MyClass'>
print
"type", type(cls._instance)#返回类对象的类型
return
cls._instance
class MyClass(Singleton):
a=1
one = MyClass()#返回一个类的实例对象
two = MyClass()#返回一个同一个实例对象
#返回:one: <__main__.MyClass object at 0x027730D0>
print "one:",one
#返回也是:two: <__main__.MyClass object at 0x027730D0>
print "two:",two
two.a = 3
print one.a
#3
#one和two完全相同,可以用id(), ==, is检测
print id(one)
#29097904
print id(two)
#29097904
print one == two
#True
print one is two
#True
结果:
c:\Python27\Scripts>python
task_test.py
type <class '__main__.MyClass'>
one: <__main__.MyClass object at 0x027A30D0>
two: <__main__.MyClass object at 0x027A30D0>
3
41562320
41562320
True
True
hasattr(cls,’_instance’):判断对象中是否包含这个属性-类变量
类实例对象里是否有这个类变量
单例用处:
http://blog.csdn.net/tanyujing/article/details/14160941
单例模式的应用场景:
1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
9. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.
python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解的更多相关文章
- java单例模式(类只能创建唯一对象)
//饿汉式 class Single { private static final Single s= new Single(); private Single(){} public static S ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- 四种生成和解析XML文档的方法详解
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- 大杂烩 -- 四种生成和解析XML文档的方法详解
基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...
- Python标准库:内置函数hasattr() getattr() setattr() 函数使用方法详解
hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False.参数object是一个对象 ...
- php通过单例模式使一个类只能创建一个对象。
单例模式也就是一个类只能创建出一个对象 首先你要知道它的基本思想为:三私一公! 何为三私一公? 1(私).防止用户通过构造方法创建对象,因此私有化构造方法. 2(公).创建一个公共静态函数用来进入 ...
- Python的Django框架中forms表单类的使用方法详解
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...
- php 生成唯一id的几种解决方法
php 生成唯一id的几种解决方法 网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid ...
- 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...
随机推荐
- hdu2586(LCA最近公共祖先)
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Java.Util.List(List接口)
equals方法 equals(Object o) 方法用来比较指定的对象与列表是否相等,当且仅当指定的对象也是一个列表.两个列表有相同的大小,并且两个列表中的所有相应的元素对相等时才返回 true. ...
- Nginx 安装 --编译模块参数
公司空出来一些服务器,很久没有来练手了,于是便开始有了这篇博客,记录下过程. Nginx 这个不多说了,名声在外,人们喜爱使用这款软件,主要还是因为它的高并发特性,公司也在用效果还不错,也用了它的一些 ...
- ADOdb 支持的数据库包括哪些?
ADOdb 支持的数据库包括 MySQL, PostgreSQL,Interbase,Firebird,Informix,Oracle,MS SQL 7,Foxpro,Access,ADO,Sybas ...
- 力推:无限制下载神器aria2
百度网盘是一个非常方便的存储以及寻找资源的好帮手,但是百度为了挣钱把非会员的下载网速一再限制(无力吐槽),还还好一直使用油猴插件加idm下载神器来下载百度云文件.奈何idm对bt种子文件不支持下载,终 ...
- HDU 5727 - Necklace - [全排列+二分图匹配][Hopcroft-Karp算法模板]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5727 Problem DescriptionSJX has 2*N magic gems. ...
- SQL Fundamentals: 分组统计查询(FROM-WHERE-GROUPBY-HAVING-SELECT-ORDER BY)
SQL Fundamentals || Oracle SQL语言 统计函数 单字段分组统计(GROUP BY) 多字段分组统计 HAVING子句 控制操作的显示列:基本的SELECT语句 控制行:限定 ...
- intptr_t、uintptr_t数据类型的解析
https://blog.csdn.net/cs_zhanyb/article/details/16973379 2013年11月26日 22:20:09 binggo 阅读数:14066 最近开 ...
- Loadrunner之脚本的思考时间(固定/随机)设置、调试、保存、测试服务器监控等(六)
一.思考时间的设置 1)设置固定思考时间: Action(){ // … your code lr_think_time(3); //固定设置此处思考时间3s // … more of your co ...
- SQL SERVER - 谁更改了SQL登录密码?
转自:https://blog.sqlauthority.com/2016/04/03/sql-server-changed-password-sql-login-interview-question ...