Python单例模式实例分析


Posted in Python onJanuary 14, 2015

本文实例讲述了Python单例模式的使用方法。分享给大家供大家参考。具体如下:

方法一

import threading  

  

class Singleton(object):  

    __instance = None  

  

    __lock = threading.Lock()   # used to synchronize code  

  

    def __init__(self):  

        "disable the __init__ method"  

 

    @staticmethod  

    def getInstance():  

        if not Singleton.__instance:  

            Singleton.__lock.acquire()  

            if not Singleton.__instance:  

                Singleton.__instance = object.__new__(Singleton)  

                object.__init__(Singleton.__instance)  

            Singleton.__lock.release()  

        return Singleton.__instance

1.禁用__init__方法,不能直接创建对象。

2.__instance,单例对象私有化。

3.@staticmethod,静态方法,通过类名直接调用。

4.__lock,代码锁。

5.继承object类,通过调用object的__new__方法创建单例对象,然后调用object的__init__方法完整初始化。

6.双重检查加锁,既可实现线程安全,又使性能不受很大影响。

方法二:使用decorator

#encoding=utf-8  

def singleton(cls):  

    instances = {}  

    def getInstance():  

        if cls not in instances:  

            instances[cls] = cls()  

        return instances[cls]  

    return getInstance  

 

@singleton  

class SingletonClass:  

    pass  

  

if __name__ == '__main__':  

    s = SingletonClass()  

    s2 = SingletonClass()  

    print s  

    print s2

也应该加上线程安全

import threading  

  

class Sing(object):  

    def __init__():  

        "disable the __init__ method"  

  

    __inst = None # make it so-called private  

  

    __lock = threading.Lock() # used to synchronize code  

 

    @staticmethod  

    def getInst():  

        Sing.__lock.acquire()  

        if not Sing.__inst:  

            Sing.__inst = object.__new__(Sing)  

            object.__init__(Sing.__inst)  

        Sing.__lock.release()  

        return Sing.__inst

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

Python 相关文章推荐
Python lxml模块安装教程
Jun 02 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
深入浅析python 中的匿名函数
May 21 Python
Python读取stdin方法实例
May 24 Python
Python类中方法getitem和getattr详解
Aug 30 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
python实现简单井字棋游戏
Mar 04 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
python文件读写操作与linux shell变量命令交互执行的方法
Jan 14 #Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 #Python
更改Python命令行交互提示符的方法
Jan 14 #Python
Python的迭代器和生成器使用实例
Jan 14 #Python
python实现带验证码网站的自动登陆实现代码
Jan 12 #Python
Python三元运算实现方法
Jan 12 #Python
Python中的True,False条件判断实例分析
Jan 12 #Python
You might like
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
第六章 php目录与文件操作
2011/12/30 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
学习vue.js条件渲染
2016/12/03 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python实现超市商品销售管理系统
2019/11/22 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
灵山大佛导游词
2015/02/04 职场文书
施工安全员岗位职责
2015/04/11 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript