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使用sorted函数对列表进行排序的方法
Apr 04 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
Python configparser模块应用过程解析
Aug 14 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
Python3.9.1中使用match方法详解
Feb 08 Python
python+opencv实现车道线检测
Feb 19 Python
python控制台打印log输出重复的解决方法
May 14 Python
用python修改excel表某一列内容的操作方法
Jun 11 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 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
用jscript实现新建word文档
2007/06/15 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
全面理解闭包机制
2016/07/11 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
SVG实现时钟效果
2018/07/17 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
Django 导出 Excel 代码的实例详解
2017/08/11 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
python中使用print输出中文的方法
2018/07/16 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
自我评价中英文语句
2013/11/30 职场文书
饭店工作计划书
2014/01/10 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
电子工程求职信
2014/07/17 职场文书
音乐学专业求职信
2014/07/22 职场文书
英雄儿女观后感
2015/06/09 职场文书
运动会1000米加油稿
2015/07/21 职场文书
小学毕业感言200字
2015/07/30 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
Vue监视数据的原理详解
2022/02/24 Vue.js