单例模式是日常应用中最广泛的模式了,其目的就是令到单个进程中只存在一个类的实例,从而可以实现数据的共享,节省系统开销,防止io阻塞等等

但是在多进程的应用中,单例模式就实现不了了,例如一些web应用,django,这些,因为会启动多条进程来监听http请求,这样的会通过单例模式是实现不了数据共享的,也就是实现不了单例模式的目的了,这时需要用进程间通信方法来实现数据共享,当然也可以尝试使用redis这些nosql数据库实现数据共享,因为它们的读取数据较快。

#encoding=utf-8
__author__ = 'kevinlu1010@qq.com' class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_the_instance'):
cls._the_instance=object.__new__(cls,*args, **kwargs)
return cls._the_instance class A(Singleton):
print 'init before'
def __init__(self):
print 'i am __init__'
def f(self):
print 'i am f' a=A()
b=A()
a.f()
print 'done'

这里写了个Singleton的类,通过重新__new__方法,可以查找当前进程有没有该类的实例,如果有就返回该实例,如果没有就新建一个

实例化两次A类(实际只实例化了一次)'init before'只会print一次,但是'i am __init__'是会print两次的,所以不想重复执行的代码要放在’init before‘的位置

这种实现方法有三个问题

1.并发的时候会有问题,这个可以通过在__new__中价格锁了解决

2.如果子类需要重新__new__函数,那就麻烦了

3.__init__函数会被调用多次

由于模块是线程安全的,而且一个模块只会被实例化一次,所以可以通过模块来实现单例

singleton.py

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com' num = 0 def print_num():
print num

main.py

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com' import singleton print singleton.num singleton.num += 1
singleton.print_num()

如果这样没有类的特性,可以这样:

singleton.py

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com' class A():
print 'init before'
num = 0 def __init__(self):
print 'i am __init__' def f(self):
print 'i am f' a=A()

main.py

# encoding=utf-8
__author__ = 'kevinlu1010@qq.com' import singleton a=singleton.a print a.f()

Python设计模式——单例模式的更多相关文章

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

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

  2. python设计模式-单例模式

    单例模式应用场景 代码的设计模式共有25种,设计模式其实是代码无关的.其目的是基于OOP的思想,不同应用场景应用不同的设计模式,从而达到简化代码.利于扩展.提示性能等目的.本文简述Python实现的单 ...

  3. Python 设计模式——单例模式

    单例模式即确保类有且只有一个特定类型的对象,并提供全局访问点.因此通常用于日志记录.数据库操作.打印机后台处理程序等.这些程序在运行过程中只生成一个实例,避免对同一资源产生相互冲突的请求. 特点: 确 ...

  4. Python学习:19.Python设计模式-单例模式

    一.单例模式存在的意义 在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式, ...

  5. Python设计模式--单例模式(懒汉式)

    1. 单例模式 --> 单一(唯一)的实例. 在整个运行时间内, 内存中只有一个对象, 一般该对象涉及网络,资源等操作. 2. 单例模式一般分为懒汉式和饿汉式 懒汉式内存占用更加合理. 3. 调 ...

  6. Python学习:Python设计模式-单例模式

    一.单例模式存在的意义 在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式, ...

  7. Python——设计模式——单例模式

    一个类始终只有一个实例 当你第一次实例化这个类的时候,就创建一个实例化得对象 当你之后再来实例化的时候,就用之前创建的对象 class A: __instance = False def __ini_ ...

  8. python设计模式之单例模式(一)

    前言 单例模式是创建模式中比较常见和常用的模式,在程序执行的整个生命周期只存在一个实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python ...

  9. python设计模式之单例模式(二)

    上次我们简单了解了一下什么是单例模式,今天我们继续探究.上次的内容点这 python设计模式之单例模式(一) 上次们讨论的是GoF的单例设计模式,该模式是指:一个类有且只有一个对象.通常我们需要的是让 ...

随机推荐

  1. [Effective C++ --011]在operator=中处理“自我赋值”

    一.何谓“自我赋值”? 1.1.场合一 直接赋值 w = w; 1.2.场合二 同一数组         a[i] = a[j]: 1.3.场合三 指针         *px = *py: 1.4. ...

  2. nopCommerce的源代码结构和架构

    下载地址 nopcommerce的源代码很容易拿到,它是开源的,所以你可以直接到网上下载.下载地址:http://www.nopcommerce.com/downloads.aspx 因为nop是国外 ...

  3. Mysql数据库导入命令Source详解

    Mysql数据库导入命令Source详解 几个常用用例: 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p dat ...

  4. PHP端验证代码、后端验证

    /** * 验证url是否存在 * @param string $url url路径 * @return boolean true:存在,false:不存在 */ public function va ...

  5. 为ListView添加头和脚

      转自:https://software.intel.com/zh-cn/blogs/2014/12/15/android-listview-addheaderview-addfooterview ...

  6. HTTPS协议学习总结

    目录 一:什么是HTTPS协议?二:客户端与服务端如何建立HTTPS协议连接?三:证书.加密协议.信息摘要.签名算法概念解释与关系梳理四:低版本操作系统作为客户端发送HTTPS失败分析五:参考资料   ...

  7. dedecms安装步骤

    GD支持:PHP设置-PHP扩展-php_gd2 初始化数据体验包:点击下载:或者点击取消     如果是本地安装在数据库的在数据库用户名选择默认的(root),密码为空 主要是如果是基于远程服务器的 ...

  8. ### CUDA

    CUDA Learning. #@author: gr #@date: 2014-04-06 #@email: forgerui@gmail.com 1. Introduction CPU和GPU的区 ...

  9. Xcode中,调试console窗口输出error: Couldn't materialize struct: the variable 'cell' has no location, it may have been optimized out的问题

    Xcode中调试代码时,常常需要使用console窗口查看变量的信息,比如使用了如下的命令来输出有关UITableView中一个UITableViewCell的信息, po cell 令人感到意外的是 ...

  10. NOIP200701

    题是这样的: 试题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再 ...