聊聊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 相关文章推荐
python实现ftp客户端示例分享
Feb 17 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python打印斐波拉契数列实例
Jul 07 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
Python如何急速下载第三方库详解
Nov 02 Python
Python四款GUI图形界面库介绍
Jun 05 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
python动态加载变量示例分享
2014/02/17 Python
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
django中瀑布流写法实例代码
2019/10/14 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
英国团购网站:Groupon英国
2017/11/28 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
J2EE是技术还是平台还是框架
2016/08/14 面试题
消防安全汇报材料
2014/02/08 职场文书
旅游市场营销方案
2014/03/09 职场文书
学生自我评语大全
2014/04/18 职场文书
党支部综合考察材料
2014/05/19 职场文书
动物科学专业求职信
2014/07/27 职场文书
党员创先争优心得体会
2014/09/11 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
民间借贷被告代理词
2015/05/23 职场文书