聊聊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之import机制详解
Jul 03 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
12步教你理解Python装饰器
Feb 25 Python
python爬虫之百度API调用方法
Jun 11 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
解决python flask中config配置管理的问题
Jul 26 Python
python画蝴蝶曲线图的实例
Nov 21 Python
Python通过队列来实现进程间通信的示例
Oct 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
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
javascript eval和JSON之间的联系
2009/12/31 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
深入理解Python中变量赋值的问题
2017/01/12 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
什么是.net
2015/08/03 面试题
培训主管的岗位职责
2013/11/23 职场文书
单位门卫岗位职责
2013/12/20 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
人事专员的职责
2014/02/26 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
自我查摆剖析材料
2014/10/11 职场文书
个人职业及收入证明
2014/10/13 职场文书
政风行风评议工作总结
2014/10/21 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
SQLServer之常用函数总结详解
2021/08/30 SQL Server
MySQL高级进阶sql语句总结大全
2022/03/16 MySQL