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 30 Python
python解析json实例方法
Nov 19 Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
Python实现计算对象的内存大小示例
Jul 10 Python
详解Python打包分发工具setuptools
Aug 05 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
django模板获取list中指定索引的值方式
May 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+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
分享php邮件管理器源码
2016/01/06 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
python 模拟登录B站的示例代码
2020/12/15 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
给全校老师的建议书
2014/03/13 职场文书
关于保护环境的建议书
2014/05/13 职场文书
安全承诺书格式
2014/05/21 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
大学生活感想
2015/08/10 职场文书
会议主持词通用版
2019/04/02 职场文书
浅谈如何保证Mysql主从一致
2022/03/13 MySQL