单例:一个类只能生成唯一的一个实例

每个类只要被实例化了,他的私有属性 '_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__方法详解的更多相关文章

  1. java单例模式(类只能创建唯一对象)

    //饿汉式 class Single { private static final Single s= new Single(); private Single(){} public static S ...

  2. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  3. 四种生成和解析XML文档的方法详解

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  4. 大杂烩 -- 四种生成和解析XML文档的方法详解

    基础大杂烩 -- 目录 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包 ...

  5. Python标准库:内置函数hasattr() getattr() setattr() 函数使用方法详解

    hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False.参数object是一个对象 ...

  6. php通过单例模式使一个类只能创建一个对象。

    单例模式也就是一个类只能创建出一个对象 首先你要知道它的基本思想为:三私一公! 何为三私一公?   1(私).防止用户通过构造方法创建对象,因此私有化构造方法. 2(公).创建一个公共静态函数用来进入 ...

  7. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  8. php 生成唯一id的几种解决方法

    php 生成唯一id的几种解决方法   网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid ...

  9. 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。

    22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...

随机推荐

  1. vue之创建组建

    vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使用组件吧! ...

  2. Asp.net MVC]Asp.net MVC5系列——实现编辑、删除与明细信息视图

    目录 概述 实现信息的明细视图 实现信息的编辑视图 实现信息的删除视图 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net ...

  3. php intval的取值范围:与操作系统相关

    php intval的取值范围:与操作系统相关,32位系统上为-2147483648到2147483647,64位系统上为-9223372036854775808到922337203685477580 ...

  4. 寻找 IBatisNet 批量插入(批量复制) 的心路历程

    1.IBatisNet本身就是一个比较早的ORM框架,再加上是从java iBatis移值过来的,其流行程度不是特别高资料也不是很多(一年前),不过最近好像搜索比较多了一些(可能是训练的结果吧) 2. ...

  5. 【紫书】Tree UVA - 548 静态建树dfs

    题意:给你中序后序 求某叶子节点使得从根到该节点权值和最小.若存在多个,输出其权值最小的那个. 题解:先建树,然后暴力dfs/bfs所有路径,取min 技巧:递归传参数,l1,r1,l2,r2, su ...

  6. Oracle管理监控之设置linux启动时自动启动oracle服务器

    1. 修改dbstart脚本(第78行):$ vi $ORACLE_HOME/bin/dbstartORACLE_HOME_LISTNER=$ORACLE_HOME 2. 修改/etc/oratab为 ...

  7. ionic项目打包好Xcode工程,模拟器运行各种沙盒缓存目录

    用ionic开发好的app,build好iOS端可用的Xcode工程,然后用模拟器跑起来.研究一下js写的代码做本地持久化时,不同类型的文件都放在那里了. cordova-plugin-sqliteS ...

  8. 【xargs -i】复制文件夹中前100个文件

    复制前一万个文件到 tmp 下 |xargs -i cp {} /tmp 复制后一万个文件到 tmp 下 |xargs -i cp {} /tmp 查看linux下文件夹文件数目 ls -l |gre ...

  9. oracle(四) 常用语句

    1.分页 select t2.* from (select rownum row, t1.*  from your_table where rownum < ?) t2 where t2.row ...

  10. 去掉UITableView多余的分割线

    UIView *v = [[UIView alloc] initWithFrame:CGRectZero]; [_tableView setTableFooterView:v];