聊聊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构建Hopfield网络的教程
Apr 14 Python
python操作MySQL 模拟简单银行转账操作
Sep 27 Python
Python中用psycopg2模块操作PostgreSQL方法
Nov 28 Python
python实现自动发送邮件
Jun 20 Python
python matlibplot绘制3D图形
Jul 02 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
浅析PEP572: 海象运算符
Oct 15 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 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 split()函数的用法详解
2013/06/05 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
详解PHP中的PDO类
2015/07/06 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
深入解答关于Python的11道基本面试题
2017/04/01 Python
对Python 数组的切片操作详解
2018/07/02 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
软件配置管理有什么好处
2015/04/15 面试题
我们的节日清明节活动总结
2014/04/30 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
实施意见格式范本
2015/06/05 职场文书
雷锋电影观后感
2015/06/10 职场文书
小学毕业感言100字
2015/07/30 职场文书
会计岗位工作总结
2015/08/12 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python