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判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Windows下为Python安装Matplotlib模块
Nov 06 Python
Python实现计算最小编辑距离
Mar 17 Python
Python Socket编程详细介绍
Mar 23 Python
浅谈Python NLP入门教程
Dec 25 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
Python 编程速成(推荐)
Apr 15 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
Dec 24 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
用PHP读取RSS feed的代码
2008/08/01 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
js运动事件函数详解
2016/10/21 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
Python Numpy库安装与基本操作示例
2019/01/08 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
以下的初始化有什么区别
2013/12/16 面试题
求职推荐信范文
2013/12/01 职场文书
爱情寄语大全
2014/04/09 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
Ajax异步刷新功能及简单案例
2021/11/20 Javascript
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server