单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象

python实现单例模式

使用模块实现

Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

mysingleton.py

class Singleton:
def foo(self):
print('foo') singleton=Singleton()

其他文件

from mysingleton import singleton

singleton.foo()

装饰器实现

def singleton(cls):
_instance = {}
def wraper(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls] return wraper @singleton
class A(object):
def __init__(self, x=0):
self.x = x a1 = A(2)
a2 = A(3)

最终实例化出一个对象并且保存在_instance中,_instance的值也一定是

基于__new__方法实现

当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.__new__),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式

class Singleton():
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
cls._instance=object.__new__(cls)
return cls._instance class A(Singleton):
def __init__(self,x):
self.x=x a=A('han')
b=A('tao')
print(a.x)
print(b.x)

为了保证线程安全需要在内部加入锁

import threading

class Singleton():
lock=threading.Lock
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
with cls.lock:
if not hasattr(cls, '_instance'):
cls._instance=object.__new__(cls)
return cls._instance class A(Singleton):
def __init__(self,x):
self.x=x a=A('han')
b=A('tao')
print(a.x)
print(b.x)

 两大注意:

1. 除了模块单例外,其他几种模式的本质都是通过设置中间变量,来判断类是否已经被实例。中间变量的访问和更改存在线程安全的问题:在开启多线程模式的时候需要加锁处理。

2. __new__方法无法避免触发__init__(),初始的成员变量会进行覆盖。其他方法不会。

单利模式及python实现方式的更多相关文章

  1. 浅谈单利模式及其应用场景(Python)

    python 中的单利模式 使用场景: + Python的logger就是一个单例模式,用以日志记录 + Windows的资源管理器是一个单例模式 + 线程池,数据库连接池等资源池一般也用单例模式 + ...

  2. Java设计模式の单利模式

    单利模式:确保一个类最多只有一个实例,并提供一个全局访问点. 经典单利模式创建对象代码 public class Singleton { private static Singleton unique ...

  3. Java 设计模式之单利模式

    一.首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...

  4. 生产消费者模式与python+redis实例运用(基础篇)

    根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃:还有一个选择,做 ...

  5. Java设计模式之单利模式(Singleton)

    单利模式的应用场景: 单利模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例.并提供一个全局反访问点.单利模式是创建型模式.单利模式在生活中应用也很广泛,比如公司C ...

  6. Java中的单利模式

    单利模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  7. java 开发中经常问到得懒汉模式 (单利模式)

    //懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...

  8. java 单利模式

    首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...

  9. static单利模式

    // //  main.m //  01-文件管理器 // //  Created by apple on 14-3-21. //  Copyright (c) 2014年 apple. All ri ...

随机推荐

  1. Python读写txt文本文件

    一.文件的打开和创建 ? 1 2 3 4 5 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python!\n ...

  2. DRM in Android详解--转

    DRM,英文全称为Digital Rights Management,译为数字版权管理.它是目前业界使用非常广泛的一种数字内容版权保护技术.随着知识产权保护受重视的程度日益提高,快速攻城略地得Andr ...

  3. sencha touch 扩展官方NavigationView 灵活添加按钮组,导航栏,自由隐藏返回按钮(2014-5-15)

    扩展视频讲解:http://www.cnblogs.com/mlzs/p/3652094.html官方NavigationView详解:http://www.cnblogs.com/mlzs/p/35 ...

  4. sencha touch list 选择插件,可记忆已选项,可分组全选

    选择记忆功能参考:https://market.sencha.com/extensions/ext-plugin-rememberselection 插件代码: /* * 记住列表选择状态 * 如果分 ...

  5. linux下find(文件查找)命令的用法总结

    关联文章:http://blog.chinaunix.net/uid-24648486-id-2998767.html

  6. Google浏览器清除缓存快捷键

    1.CTRL+SHIFT+DEL:直接进入“清除浏览数据”页面,包括清除浏览历史记录.清空缓存.删除Cookie等. 2.chrome浏览器F12中 ctrl+p 可以定位文件

  7. Power Shell 学习笔记

    Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境. 桌面右击任务栏开始图标,打开控制台对话窗: Windows PowerShell ISE 应用程序的文 ...

  8. iOS - 长按图片识别图中二维码

    长按图片识别图中二维码: // 长按图片识别二维码 UILongPressGestureRecognizer *QrCodeTap = [[UILongPressGestureRecognizer a ...

  9. cadence upf低功耗流程的仿真验证

    本文是记录项目过程中遇到的奇巧淫技,如有遗漏或者不足,请大家改正和补充,谢谢. 随着深亚微米技术的普及与发展,leakage功耗在整个功耗中的比重越来越大,比如45nm下,已经占到了60%以上,所以低 ...

  10. 使用 Python 进行 socket 编程

    本文主要参考 https://docs.python.org/3/howto/sockets.html . 本文只讨论 STREAME(比如 TCP) INET(比如 IPv4) socket. 在多 ...