聊聊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实现将汉字转换成汉语拼音的库
May 05 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
python logging日志模块的详解
Oct 29 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
Python 经典算法100及解析(小结)
Sep 13 Python
python做接口测试的必要性
Nov 20 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
AI:如何训练机器学习的模型
Apr 16 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 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 cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
使用python打印十行杨辉三角过程详解
2019/07/10 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
Shell编程面试题
2016/05/29 面试题
酒店办公室文员岗位职责
2013/12/18 职场文书
鉴定评语大全
2014/05/05 职场文书
会议欢迎标语
2014/06/30 职场文书
三八妇女节主持词
2015/07/04 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
办公室卫生管理制度
2015/08/04 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
Go语言基础map用法及示例详解
2021/11/17 Golang
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA