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程序中进行文件读取和写入操作的教程
Apr 28 Python
Python中的super()方法使用简介
Aug 14 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
简单了解Python3里的一些新特性
Jul 13 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
简单了解Python变量作用域正确使用方法
Jun 12 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 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
介绍几个array库的新函数 php
2006/12/29 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
python计算最小优先级队列代码分享
2013/12/18 Python
下载给定网页上图片的方法
2014/02/18 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Python中extend和append的区别讲解
2019/01/24 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
python把1变成01的步骤总结
2019/02/27 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
盛大笔试题
2016/11/05 面试题
一个大学生十年的职业规划
2014/01/17 职场文书
宿舍打麻将检讨书
2014/01/24 职场文书
建筑节能汇报材料
2014/08/22 职场文书
争先创优心得体会
2014/09/12 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
css3 文字断裂效果
2022/04/22 HTML / CSS