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 22 Python
简述Python中的面向对象编程的概念
Apr 27 Python
浅析Python中的join()方法的使用
May 19 Python
python如何获取服务器硬件信息
May 11 Python
Python进程间通信之共享内存详解
Oct 30 Python
python中学习K-Means和图片压缩
Nov 20 Python
详解Django+Uwsgi+Nginx的生产环境部署
Jun 25 Python
获取python的list中含有重复值的index方法
Jun 27 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Python正则表达式学习小例子
Mar 03 Python
Python嵌入C/C++进行开发详解
Jun 09 Python
python-地图可视化组件folium的操作
Dec 14 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下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
python实现两个文件合并功能
2018/04/01 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
Django 内置权限扩展案例详解
2019/03/04 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
python向图片里添加文字
2019/11/26 Python
python中format函数如何使用
2020/06/22 Python
经典c++面试题五
2014/12/17 面试题
八项规定整改措施
2014/02/12 职场文书
电工技术比武方案
2014/05/11 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
英语投诉信范文
2015/07/03 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
学习心得体会
2019/06/20 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
python实现剪贴板的操作
2021/07/01 Python
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js
python热力图实现的完整实例
2022/06/25 Python