聊聊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中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
python 多进程队列数据处理详解
Dec 23 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
python 错误处理 assert详解
Apr 20 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 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批量检测并去除文件BOM头代码实例
2014/05/08 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
python遍历序列enumerate函数浅析
2017/10/17 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
django修改models重建数据库的操作
2020/03/31 Python
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
光声世纪笔试题目
2012/08/25 面试题
渔夫的故事教学反思
2014/02/14 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
抽奖活动主持词
2014/03/31 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
大学生党性分析材料
2014/12/19 职场文书
优秀团支部申报材料
2014/12/26 职场文书
管理失职检讨书范文
2015/05/05 职场文书
民事诉讼代理词
2015/05/25 职场文书
新闻通讯稿范文
2015/07/22 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
R9700摩机记
2022/04/05 无线电
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技