聊聊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数据类型转换函数总结
Mar 11 Python
Python2.x与Python3.x的区别
Jan 14 Python
Python常用知识点汇总
May 08 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
浅谈Python中eval的强大与危害
Mar 13 Python
python 随机生成10位数密码的实现代码
Jun 27 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
基于Python的Jenkins的二次开发操作
May 12 Python
Python爬虫小例子——爬取51job发布的工作职位
Jul 10 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 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使用PDO方法详解
2014/12/27 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
JavaScript 原型继承
2011/12/26 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
vue-cli系列之vue-cli-service整体架构浅析
2019/01/14 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python with标签使用方法解析
2020/01/17 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
2014年预备党员学习两会心得体会
2014/03/17 职场文书
高中生家长寄语大全
2014/04/03 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
五年级上册复习计划
2015/01/19 职场文书
毕业生党员个人总结
2015/02/14 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
MySQL数据库 安全管理
2022/05/06 MySQL