聊聊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判断IP地址合法性的方法实例
Mar 13 Python
Python读写Redis数据库操作示例
Mar 18 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Python利用turtle库绘制彩虹代码示例
Dec 20 Python
Python多继承顺序实例分析
May 26 Python
python3.6实现学生信息管理系统
Feb 21 Python
Python生成一个迭代器的实操方法
Jun 18 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 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页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
javascript some()函数用法详解
2014/11/13 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
python+rsync精确同步指定格式文件
2019/08/29 Python
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
金融专业应届生求职信
2013/11/02 职场文书
农救科工作职责
2013/11/27 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
小学中等生评语
2014/12/29 职场文书
优秀党员个人总结
2015/02/14 职场文书
房租涨价通知
2015/04/23 职场文书
投诉书范文
2015/07/02 职场文书
2016教师节问候语
2015/11/10 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
初中思想品德教学反思
2016/02/24 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL