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 os模块介绍
Nov 30 Python
Python中集合类型(set)学习小结
Jan 28 Python
整理Python最基本的操作字典的方法
Apr 24 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
python numpy格式化打印的实例
May 14 Python
Python XML转Json之XML2Dict的使用方法
Jan 15 Python
Python中整数的缓存机制讲解
Feb 16 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
django列表筛选功能的实现代码
Mar 27 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 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获取后台Job管理的实现代码
2011/06/10 PHP
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
最新大学职业规划书范文
2013/12/30 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
小学生作文评语集锦
2014/12/25 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
学校百日安全活动总结
2015/05/07 职场文书
java实现web实时消息推送的七种方案
2022/07/23 Java/Android