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 内置函数complex详解
Oct 23 Python
Python升级导致yum、pip报错的解决方法
Sep 06 Python
python实现xlsx文件分析详解
Jan 02 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python使用tomorrow实现多线程的例子
Jul 20 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
Python字符串的修改方法实例
Dec 19 Python
python Shapely使用指南详解
Feb 18 Python
python pymysql库的常用操作
Oct 16 Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 Python
python自动化调用百度api解决验证码
Apr 13 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
我的论坛源代码(一)
2006/10/09 PHP
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
php读取文件内容的三种可行方法示例介绍
2014/02/08 PHP
PHP进程同步代码实例
2015/02/12 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
JQuery从头学起第三讲
2010/07/06 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
JavaScript调试之console.log调试的一个小技巧分享
2017/08/07 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Django多数据库联用实现方法解析
2020/11/12 Python
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
Linux开机引导的步骤是什么
2014/02/26 面试题
留学自荐信写作方法
2014/01/27 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB