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 相关文章推荐
Python中的urllib模块使用详解
Jul 07 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
python flask中静态文件的管理方法
Mar 20 Python
深入理解Django自定义信号(signals)
Oct 15 Python
python+flask实现API的方法
Nov 21 Python
python实现电子产品商店
Feb 26 Python
浅谈python标准库--functools.partial
Mar 13 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
Nov 15 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
pytorch学习教程之自定义数据集
Nov 10 Python
浅谈Python数学建模之数据导入
Jun 23 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
jQuery实现大转盘抽奖活动仿QQ音乐代码分享
2015/08/21 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
JavaScript实现点击按钮字体放大、缩小
2016/02/29 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python实现在线音乐播放器
2017/03/03 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Python实现密码薄文件读写操作
2019/12/16 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
询价采购方案
2014/06/09 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
小学科学教学计划
2015/01/21 职场文书
企业员工辞职信范文
2015/05/12 职场文书
小型婚礼主持词
2015/06/30 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android