聊聊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中pass语句用法实例分析
Apr 30 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
Python List cmp()知识点总结
Feb 18 Python
python openpyxl使用方法详解
Jul 18 Python
python内存管理机制原理详解
Aug 12 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
Python getsizeof()和getsize()区分详解
Nov 20 Python
Flask中jinja2的继承实现方法及实例
Mar 03 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
jQuery 名称冲突的解决方法
2011/04/08 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
详解vuex的简单使用
2018/03/12 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
2019/04/22 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
Python高效编程技巧
2013/01/07 Python
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
python Django模板的使用方法
2016/01/14 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
Python PIL库图片灰化处理
2020/04/07 Python
应聘护士自荐信
2013/10/21 职场文书
策划主管的工作职责
2013/11/24 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
军神教学反思
2014/02/04 职场文书
小学科学教学计划
2015/01/21 职场文书