理论

单例模式的特点是确保类只有一个实例化对象被创建,并让程序可以全局访问这个对象。

常用于日志记录、数据库操作、打印机后台处理程序等,这些程序在运行过程中只能生成一个实例,以避免对同一资源产生相互冲突的请求。

单例模式是一种经过时间考验的成熟方法,能够在不带来太多缺陷的情况下提供全局访问点。

实战

1、利用python实现经典的单例模式

class Singleton:def __new__(cls):if not hasattr(cls, 'instance'):cls.instance = super(Singleton, cls).__new__(cls)return cls.instancea = Singleton()
a2 = Singleton()print(a, a2)# 运行结果
# <__main__.Singleton object at 0x109dbd750> <__main__.Singleton object at 0x109dbd750>

使用类名创建对象时,python的解释器首先调用__new__方法为对象分配空间,__new__方法是由object基类提供的内置静态方法,主要的作用有两个,一是在内存中为对象分配空间,二是返回对象的引用。

方法hasattr用于查看对象cls是否具有属性'instance'

2、懒汉实例化

在导入模块的时候,我们可能会无意中创建一个对象,但程序根本没用到它。

懒汉实例化的意思就是可以确保在实际需要的时候才创建对象,是一种节约资源的方式。

class Singleton:_instance = Nonedef __init__(self):if not Singleton._instance:print('instance未被创建')else:print('instance已经被创建:', self.getInstance())@classmethoddef getInstance(cls):if not cls._instance:cls._instance = Singleton()return cls._instances = Singleton()  # 实例化对象,但instance并未被创建
Singleton.getInstance()  # 创建对象
s1 = Singleton()  # 实例化对象, instance已被创建#  运行结果
'''
instance未被创建
instance未被创建
instance已经被创建: <__main__.Singleton object at 0x103c7f750>
'''

3、模块级别的单例模式

所有的模块都默认为单例,这是由python的导入行为决定的。

在导入一个模块时,python的工作方式为:

  • 检查这个模块是否已经被导入。
  • 如果已经导入,则返回这个模块的对象,如果没有导入,就导入这个模块,并实例化。

模块在导入的时候就会被初始化,同一个模块再次被导入的时候,它不会再初始化,因为单例模式只有一个对象,它会返回同一个对象。

4、Monostate单例模式

上面我们所说的单例模式指的是GoF(the Gang of Four, GoF)的单例设计模式,核心思想是:一个类有且只有一个对象。

但有另一种说法,Alex Martelli认为通常程序员需要的是让实例共享相同的状态,他建议开发人员应该关注状态和行为,而不是同一性。这个概念关注的是所有对象共享相同状态,因此被称为Monostate(单态)模式。

Monostate模式可以通过python轻松实现。

class Borg:__shared_state = {'1': '2'}def __init__(self):self.x = 1self.__dict__ = self.__shared_stateb = Borg()
b1 = Borg()
b.x = 4print(b)
print(b1)
print(b.__dict__)
print(b1.__dict__)# 运行结果
'''
<__main__.Borg object at 0x10d0a5e50>
<__main__.Borg object at 0x10d1756d0>
{'1': '2', 'x': 4}
{'1': '2', 'x': 4}
'''

python使用__dict__存储一个实例化对象中所有变量的状态。

在上面代码中,在类初始化时我们把类属性__shared_state赋值给__dict__,经过这一步骤,Borg的所有实例化对象的__dict__都将指向__shared_state,也就是说Borg所有实例化对象的__dict__变量成为了同一个变量。

当对象b的实例属性x发生变化,这个变化会反映到对象b的__dict__属性上,由于所有实例化对象的__dict__都指向同一个类属性__shared_state,实例属性__dict__发生变化等同于类属性__shared_state发生变化,这将导致所有实例化对象的__dict__属性发生变化。因此,在实例化对象b的属性x发生变化时,另一个实例化对象b1的实例属性x也会随着发生变化。

python设计模式:单例模式相关推荐

  1. Python设计模式-单例模式

    Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...

  2. Python 设计模式: 单例模式(singleton pattern)

    2019独角兽企业重金招聘Python工程师标准>>> 如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现. 在 Python 中实现单例模式有很多种方式, ...

  3. python的编程模式-Python设计模式:为了整洁又时尚的代码

    关键时刻,第一时间送达! 作者ANDREI BOYANOV - 高级软件工程师 @TOPTAL 让我们再重申一下:Python是一种具有动态类型和动态绑定的高级编程语言.我将它描述为一个强大的高级动态 ...

  4. python采用单例模式游戏_Python实现Singleton模式的方式详解

    前言 使用python实现设计模式中的单例模式.单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的.本文将简要介绍一下python中实现单例模式的几种常见方式和原理.一方面可以加深对 ...

  5. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  6. 笔记:python设计模式

    文章目录 概述 什么是设计模式 为什么使用设计模式 python设计模式 1. 策略模式 2. 适配器模式 3. 工厂模式 4. 装饰器模式 5. 单例模式 小结 概述 整理网上python设计模式资 ...

  7. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  8. Python 实现单例模式

    Python 实现单例模式 单例模式是一种软件设计模式. 在面向对象编程中,通过单例模式只能创建一个类实例,也就是一个类永远只有一个实例对象. 在工作中,为了确保某一个类只会创建出一个实例,就需要使用 ...

  9. 炒冷饭系列:设计模式 单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...

  10. Python实现单例模式的几种方式

    认识单例模式 含义 单例模式是一种常用的软件设计模式,在应用这个模式时,类只会生成一个实例对象. 换句话说,单例模式确保某个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例,当我们在程序中的 ...

最新文章

  1. Hibernate5-命名查询
  2. BSP二叉树的数学原理(绝对原创)
  3. python 遍历文件 获取文件修改时间
  4. Java工程中引用Base64编码解码小记
  5. [YTU]_2444(C++习题 对象转换)
  6. [智力问答] 十个最难的字 你认识几个
  7. apache lucene_全文搜索Apache Lucene简介
  8. 邮箱如何秘密发送多个人邮件_如何发送秘密消息
  9. 网络协议,各层功能,各层协议
  10. 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了!
  11. 1008.protobuf语句内存对齐的错误
  12. 大数据之-Hadoop之HDFS的API操作_写数据流程_上传数据原理剖析_案例---大数据之hadoop工作笔记0066
  13. 安装以太坊客户端geth的方法
  14. 荣耀play3 鸿蒙,荣耀play系列跳过2直接上3代,999元的配置还能愉快play吗?
  15. Java陷阱一箩筐----面试题集
  16. [读书笔记] 机器学习 (一)绪论
  17. jq数组清空_JQuery 数组获取和删除元素
  18. ThingsBoard设备在线状态-active服务端属性分析
  19. 遭遇Trojan PSW OnlineGames Trojan HiJack a Trojan PSW ZhuXian
  20. 5T的资源大礼包整合,总有你想要的!

热门文章

  1. zn5 java 软件_Moto ZN5驱动
  2. 百度网盘ipad版的一些小技巧
  3. 计算机一级考试做网络题,全国计算机等级考试一级考试练习题附答案
  4. rsync远程数据同步工具
  5. Windows10 > Iphone手机 > 将照片和视频从手机导入到 PC
  6. 超大文件上传下载以及秒传、提速和限速方案完整(包含前后端)
  7. Altium Designer圆形、椭圆形敷铜
  8. Mac与iPhone屏幕录制
  9. cron 工具 每分钟_在线cron表达式生成工具
  10. P7960 [NOIP2021] 报数