Python单体模式的几种常见实现方法详解


Posted in Python onJuly 28, 2017

本文实例讲述了Python单体模式的几种常见实现方法。分享给大家供大家参考,具体如下:

这里python实现的单体模式,参考了:https://stackoverflow.com/questions/1363839/python-singleton-object-instantiation/1363852#1363852

一、修改父类的 __dict__

class Borg:
  _shared_state = {}
  def __init__(self):
    self.__dict__ = self._shared_state
class Singleton(Borg):
  def __init__(self, name):
    super().__init__()
    self.name = name
  def __str__(self):
    return self.name
x = Singleton('sausage')
print(x)
y = Singleton('eggs')
print(y)
z = Singleton('spam')
print(z)
print(x)
print(y)

注意,这种方法实现的并非真正的单体模式!!

下面几种方法实现的才是真正的单体模式

二、使用元类

先看看这里关于元类的描述:

元类一般用于创建类。

在执行类定义时,解释器必须要知道这个类的正确的元类。解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类。如果此属性没有定义,它会向上查找父类中的__metaclass__。如果还没有发现__metaclass__属性,解释器会检查名字为__metaclass__的全局变量,如果它存在,就使用它作为元类。否则, 使用内置的 type 作为此类的元类。

1. 继承 type,使用 __call__

注意__call__的参数

class Singleton(type):
  _instance = None
  def __call__(self, *args, **kw):
    if self._instance is None:
      self._instance = super().__call__(*args, **kw)
    return self._instance
class MyClass(object):
  __metaclass__ = Singleton
print(MyClass())
print(MyClass())

2. 继承 type,使用 __new__

注意__new__的参数

class Singleton(type):
  _instance = None
  def __new__(cls, name, bases, dct):
    if cls._instance is None:
      cls._instance = super().__new__(cls, name, bases, dct)
    return cls._instance
class MyClass(object):
  __metaclass__ = Singleton
print(MyClass())
print(MyClass())

3. 继承 object,使用 __new__

注意__new__的参数

class Singleton(object):
  _instance = None
  def __new__(cls):
    if cls._instance is None:
      cls._instance = super().__new__(cls)
    return cls._instance
class MyClass(object):
  __metaclass__ = Singleton
print(MyClass())
print(MyClass())

下面还有一个很巧妙的方法实现单体模式

使用类方法classmethod

class Singleton:
  _instance = None
  @classmethod
  def create(cls):
    if cls._instance is None:
      cls._instance = cls()
    return cls._instance
  def __init__(self):
    self.x = 5    # or whatever you want to do
sing = Singleton.create()
print(sing.x) # 5
sec = Singleton.create()
print(sec.x) # 5

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

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

Python 相关文章推荐
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python subprocess模块常见用法分析
Jun 12 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
Python之循环结构
Jan 15 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
python requests库的使用
Jan 06 Python
深入浅出分析Python装饰器用法
Jul 28 #Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 #Python
Python使用sorted排序的方法小结
Jul 28 #Python
python发送邮件实例分享
Jul 28 #Python
Python分治法定义与应用实例详解
Jul 28 #Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 #Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 #Python
You might like
YII分模块加载路由的实现方法
2018/10/01 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
JavaScript知识点整理
2015/12/09 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
wxPython 入门教程
2008/10/07 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
利用python获取Ping结果示例代码
2017/07/06 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
python3 map函数和filter函数详解
2019/08/26 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
如何开发一个JQuery插件
2016/07/28 面试题
党员公开承诺书内容
2014/05/20 职场文书
2014年居委会工作总结
2014/12/09 职场文书
承诺函格式模板
2015/01/21 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
离婚案件原告代理词
2015/05/23 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL