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使用ftplib实现简易FTP客户端的方法
Jun 03 Python
Python实现的简单hangman游戏实例
Jun 28 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
python实现随机梯度下降(SGD)
Mar 24 Python
Python反转序列的方法实例分析
Mar 21 Python
PyQt5实现下载进度条效果
Apr 19 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
Python常用数字处理基本操作汇总
Sep 10 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
python如何修改文件时间属性
Feb 05 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将任何格式视频转为flv的代码
2009/09/03 PHP
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
php比较相似字符串的方法
2015/06/05 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
浅析vue数据绑定
2017/01/17 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python中的with...as用法介绍
2015/05/28 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
EJB实例的生命周期
2016/10/28 面试题
Java如何读取CLOB字段
2013/10/10 面试题
社团招新策划书
2014/02/04 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书