聊聊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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
用map函数来完成Python并行任务的简单示例
Apr 02 Python
Python引用模块和查找模块路径
Mar 17 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
Python基于dom操作xml数据的方法示例
May 12 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
Kears+Opencv实现简单人脸识别
Aug 28 Python
python实现的Iou与Giou代码
Jan 18 Python
python连接PostgreSQL过程解析
Feb 09 Python
python烟花效果的代码实例
Feb 25 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 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
PHP安全配置
2006/10/09 PHP
PHP生成静态页面详解
2006/12/05 PHP
php下使用无限生命期Session的方法
2007/03/16 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python过滤列表用法实例分析
2016/04/29 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
教师师德考核自我评价
2014/09/13 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
2015年教师业务工作总结
2015/05/26 职场文书