聊聊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的Django框架中的模版相关知识
Jul 15 Python
Python正则表达式分组概念与用法详解
Jun 24 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python模块之time模块(实例讲解)
2017/09/13 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
python中count函数简单的实例讲解
2020/02/06 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
高分子材料与工程专业推荐信
2013/12/01 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
财政局个人总结
2015/03/04 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript
详解用Python把PDF转为Word方法总结
2021/04/27 Python
python 网络编程要点总结
2021/06/18 Python
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫