聊聊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正则表达式操作指南(re使用)
Sep 06 Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
python django生成迁移文件的实例
Aug 31 Python
Pyqt5自适应布局实例
Dec 13 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
Python如何安装第三方模块
May 28 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
Django contrib auth authenticate函数源码解析
Nov 12 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
Protoss热键控制
2020/03/14 星际争霸
记录mysql性能查询过程的使用方法
2013/05/02 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
PHP模块化安装教程
2016/06/01 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
input框中的name和id的区别
2016/11/16 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
Python中使用不同编码读写txt文件详解
2015/05/28 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
值得收藏的10道python 面试题
2019/04/15 Python
python实现简单坦克大战
2020/03/27 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
计算机个人求职信范例
2014/01/24 职场文书
2014年就业工作总结
2014/11/26 职场文书
领导新年致辞2016
2015/07/29 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫