聊聊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解析文件示例
Jan 23 Python
简单上手Python中装饰器的使用
Jul 12 Python
python构建自定义回调函数详解
Jun 20 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
Nov 21 Python
python实现用户管理系统
Jan 10 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
python中如何使用分步式进程计算详解
Mar 22 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Django REST framework 视图和路由详解
Jul 19 Python
Python简易计算器制作方法代码详解
Oct 31 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/02 无线电
PHP引用返回用法示例
2016/05/28 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
window.location.hash 属性使用说明
2010/03/20 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
node.js 使用ejs模板引擎时后缀换成.html
2015/04/22 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python实现基于POS算法的区块链
2018/08/07 Python
详解小白之KMP算法及python实现
2019/04/04 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
python生成任意频率正弦波方式
2020/02/25 Python
python实现超级马里奥
2020/03/18 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
高校教师思想汇报
2014/01/11 职场文书
教师一岗双责责任书
2014/04/16 职场文书
酒店端午节活动方案
2014/08/26 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
MySQL 条件查询的常用操作
2022/04/28 MySQL
SQL中的连接查询详解
2022/06/21 SQL Server