聊聊python里如何用Borg pattern实现的单例模式


Posted in Python onJune 06, 2019

有如下 borg pattern 的实现:

class Borg(object):
  __shared_state = {}

  def __init__(self):
    self.__dict__ = self.__shared_state
    self.state = 'Init'

  def __str__(self):
    return self.state

之前一直看不懂为什么 Borg class 要那样实现, 后来学到两个知识点后发现原来这么简单明了:

  • 关于 __shared_state:
    • 在 __init__(self, ) 外面定义的变量,是属于这个 class 的,并且由所有的 instance 共享的,而不是单属于某个instance; 在 __init__(self, ) 里面定义的变量,只属于这个 object instance (self) 本身。
  • 关于 __dict__:
    • 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的;对象的__dict__中存储了一些self.xxx的一些东西

试着跑一下:

if __name__ == '__main__':
  rm1 = Borg()
  rm2 = Borg()

  rm1.state = 'Idle'
  rm2.state = 'Running'

  print('rm1: {0}'.format(rm1))
  print('rm2: {0}'.format(rm2))

  rm2.state = 'Zombie'

  print('rm1: {0}'.format(rm1))
  print('rm2: {0}'.format(rm2))

  print('rm1 id: {0}'.format(id(rm1)))
  print('rm2 id: {0}'.format(id(rm2)))

  rm3 = YourBorg()

  print('rm1: {0}'.format(rm1))
  print('rm2: {0}'.format(rm2))
  print('rm3: {0}'.format(rm3))

其结果为:

### OUTPUT ###
# rm1: Running
# rm2: Running
# rm1: Zombie
# rm2: Zombie
# rm1 id: 140732837899224
# rm2 id: 140732837899296
# rm1: Init
# rm2: Init
# rm3: Init

本文代码来自: https://github.com/faif/python-patterns/blob/master/patterns/creational/borg.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
django ajax json的实例代码
May 29 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
使用Python实现毫秒级抢单功能
Jun 06 #Python
使用celery执行Django串行异步任务的方法步骤
Jun 06 #Python
python opencv摄像头的简单应用
Jun 06 #Python
Python完成毫秒级抢淘宝大单功能
Jun 06 #Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 #Python
记录Python脚本的运行日志的方法
Jun 05 #Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 #Python
You might like
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
js的闭包的一个示例说明
2008/11/18 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
在Django的模型中添加自定义方法的示例
2015/07/21 Python
简单解决Python文件中文编码问题
2015/11/22 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
python+OpenCV实现图像拼接
2020/03/05 Python
python文件读取失败怎么处理
2020/06/23 Python
python 6行代码制作月历生成器
2020/09/18 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
2014年效能监察工作总结
2014/11/21 职场文书
教师节主持词开场白
2015/05/29 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
《山中访友》教学反思
2016/02/24 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
MySQL窗口函数的具体使用
2021/11/17 MySQL
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS