聊聊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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python 的内置字符串方法小结
Mar 15 Python
python操作 hbase 数据的方法
Dec 18 Python
Python使用django搭建web开发环境
Jun 09 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
python三引号输出方法
Feb 27 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
python实现的生成word文档功能示例
Aug 23 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
Python使用xpath实现图片爬取
Sep 16 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
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
JavaScript Date对象应用实例分享
2017/10/30 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
了解重排与重绘
2019/05/29 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python实现的jpg格式图片修复代码
2015/04/21 Python
python实现网站的模拟登录
2016/01/04 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
python的unittest测试类代码实例
2017/12/07 Python
python实现手机销售管理系统
2019/03/19 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
Python 列表的清空方式
2020/01/13 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
护理专科毕业推荐信
2013/11/10 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
一年级班主任感言
2014/03/08 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
公司开除员工通知
2015/04/22 职场文书
音乐课外活动总结
2015/05/09 职场文书
小学毕业感言200字
2015/07/30 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS