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 相关文章推荐
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
神经网络相关之基础概念的讲解
Dec 29 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
python里运用私有属性和方法总结
Jul 08 Python
pygame实现成语填空游戏
Oct 29 Python
wxpython多线程防假死与线程间传递消息实例详解
Dec 13 Python
python中使用input()函数获取用户输入值方式
May 03 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
python pygame入门教程
Jun 01 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 header()函数常用方法总结
2014/04/11 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
js中if语句的几种优化代码写法
2011/03/12 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Python中optparser库用法实例详解
2018/01/26 Python
python中kmeans聚类实现代码
2018/02/23 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
出纳的岗位职责
2013/11/09 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
网络信息安全承诺书
2014/03/26 职场文书
文明村创建实施方案
2014/03/27 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏