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 相关文章推荐
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
快速入手Python字符编码
Aug 03 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
python基于ID3思想的决策树
Jan 03 Python
TensorFlow变量管理详解
Mar 10 Python
详解python配置虚拟环境
Apr 08 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
python爬虫基础之urllib的使用
Dec 31 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数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
从vue源码看props的用法
2019/01/09 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
Python不规范的日期字符串处理类
2014/06/10 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
Python制作Windows系统服务
2017/03/25 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
python实现人像动漫化的示例代码
2020/05/17 Python
详解Python流程控制语句
2020/10/28 Python
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
塔吉特百货公司官网:Target
2017/04/27 全球购物
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
先进党支部申报材料
2014/12/24 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
教育教学读书笔记
2015/07/02 职场文书
PHP命令行与定时任务
2021/04/01 PHP
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python