聊聊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创建XML文档
Mar 01 Python
Python实现的检测web服务器健康状况的小程序
Sep 17 Python
python获取当前日期和时间的方法
Apr 30 Python
Python使用metaclass实现Singleton模式的方法
May 05 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
python调用摄像头显示图像的实例
Aug 03 Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 Python
浅谈Python反射 & 单例模式
Mar 21 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
Python日志处理模块logging用法解析
May 19 Python
python如何进入交互模式
Jul 06 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
Ajax PHP简单入门教程代码
2008/04/25 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python读大数据txt
2016/03/28 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
大班开学家长寄语
2014/04/04 职场文书
《鲸》教学反思
2016/02/23 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
基于Python实现射击小游戏的制作
2022/04/06 Python