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+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
在pycharm中显示python画的图方法
Aug 31 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
如何使用PyCharm引入需要使用的包的方法
Sep 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
第五节 克隆 [5]
2006/10/09 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
JavaScript 参考教程
2006/12/29 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
python实现360的字符显示界面
2014/02/21 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
Python换行与不换行的输出实例
2020/02/19 Python
python如何代码集体右移
2020/07/20 Python
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
门诊手术室工作制度
2014/01/30 职场文书
卖车协议书
2014/04/21 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js