聊聊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中datetime常用时间处理方法
Jun 15 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
python中的常量和变量代码详解
Jul 25 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
python日志logging模块使用方法分析
May 23 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
python基础之文件处理知识总结
May 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 Hex RGB颜色值互换的使用
2013/05/10 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
js 学习笔记(三)
2009/12/29 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
[03:40]2014DOTA2国际邀请赛 B神专访:躲箭真的很难
2014/07/13 DOTA
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
django admin 添加自定义链接方式
2020/03/11 Python
python集合能干吗
2020/07/19 Python
python Selenium 库的使用技巧
2020/10/16 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
对标管理实施方案
2014/03/12 职场文书
国际金融专业自荐信
2014/07/05 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
python超详细实现完整学生成绩管理系统
2022/03/17 Python
我的收音机情缘
2022/04/05 无线电