常见的在Python中实现单例模式的三种方法


Posted in Python onApril 08, 2015

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在Python中,单例模式有以下几种实现方式。

方法一、实现__new__方法,然后将类的一个实例绑定到类变量_instance上;如果cls._instance为None,则说明该类还没有被实例化过,new一个该类的实例,并返回;如果cls._instance不为None,直接返回_instance,代码如下:

class Singleton(object):
 
  def __new__(cls, *args, **kwargs):
    if not hasattr(cls, '_instance'):
      orig = super(Singleton, cls)
      cls._instance = orig.__new__(cls, *args, **kwargs)
    return cls._instance
 
class MyClass(Singleton):
  a = 1
 
one = MyClass()
two = MyClass()
 
#one和two完全相同,可以用id(), ==, is检测
print id(one)  # 29097904
print id(two)  # 29097904
print one == two  # True
print one is two  # True

方法二、本质上是方法一的升级版,使用__metaclass__(元类)的高级python用法,具体代码如下:

class Singleton2(type):
 
  def __init__(cls, name, bases, dict):
    super(Singleton2, cls).__init__(name, bases, dict)
    cls._instance = None
 
  def __call__(cls, *args, **kwargs):
    if cls._instance is None:
      cls._instance = super(Singleton2, cls).__call__(*args, **kwargs)
    return cls._instance
 
class MyClass2(object):
  __metaclass__ = Singleton2
  a = 1
 
one = MyClass2()
two = MyClass2()
 
print id(one)  # 31495472
print id(two)  # 31495472
print one == two  # True
print one is two  # True

方法三、使用Python的装饰器(decorator)实现单例模式,这是一种更Pythonic的方法;单利类本身的代码不是单例的,通装饰器使其单例化,代码如下:

def singleton(cls, *args, **kwargs):
  instances = {}
  def _singleton():
    if cls not in instances:
      instances[cls] = cls(*args, **kwargs)
    return instances[cls]
  return _singleton
 
@singleton
class MyClass3(object):
  a = 1
 
one = MyClass3()
two = MyClass3()
 
print id(one)  # 29660784
print id(two)  # 29660784
print one == two  # True
print one is two  # True
Python 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
浅谈python中的占位符
Nov 09 Python
彻底理解Python中的yield关键字
Apr 01 Python
python实现关闭第三方窗口的方法
Jun 28 Python
python实现串口自动触发工作的示例
Jul 02 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
Python中的Cookie模块如何使用
Jun 04 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 Python
分析Python的Django框架的运行方式及处理流程
Apr 08 #Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 #Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 #Python
使用Python操作Elasticsearch数据索引的教程
Apr 08 #Python
用Python实现协同过滤的教程
Apr 08 #Python
在Python中调用ggplot的三种方法
Apr 08 #Python
Python字符串和文件操作常用函数分析
Apr 08 #Python
You might like
ThinkPHP验证码使用简明教程
2014/03/05 PHP
php中adodbzip类实例
2014/12/08 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
基于python 字符编码的理解
2017/09/02 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
python实现多张图片拼接成大图
2019/01/15 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
python编写俄罗斯方块
2020/03/13 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
金山毒霸系列的笔试题
2013/04/13 面试题
车间主管岗位职责
2013/11/14 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
网络研修随笔感言
2014/02/17 职场文书
体育运动口号
2014/06/09 职场文书
园林系毕业生求职信
2014/06/23 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python