理论

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

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

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

实战

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. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)
  2. 现代软件工程讲义 12 绩效管理
  3. python面部颜色分析_Python图像处理之颜色的定义与使用分析
  4. SQL的简单增、删、改
  5. 在鼠标点击的位置 ,添加一个div ,类似手表右键菜单
  6. 二分图的匹配(未完)
  7. 基于PHP+MySQL游戏商城销售网站的设计与实现#计算机毕设
  8. ios游戏开发 Sprite Kit教程:初学者 1
  9. c语言计算机二级涉及内容,计算机二级(C语言)都考哪些内容?
  10. 微服务部署之蓝绿发布、滚动发布、灰度发布区别与特点!
  11. LTP(Linux Test Project)学习(五)——LTP代码学习
  12. 计算机电源 4pin,用电脑电源4PIN接口做的2mm插头插座,省钱方便~
  13. 怎么查看网站数据库服务器ip地址,怎么查看网站数据库服务器ip地址吗
  14. 数据分析需要掌握的知识(2)
  15. 2023阿里云服务器租用价格CPU/内存/带宽/系统盘收费标准
  16. CTF逆向-IDA Pro攻防世界Hello CTF
  17. 模拟机械键盘音效的软件
  18. microbit测试题
  19. android widget动画,widget 动画 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. Android仿QQ通讯录分组展示ExpandableListView

热门文章

  1. 2017年3月5日 星期日 --出埃及记 Exodus 23:23
  2. 2017年2月18日 星期六 --出埃及记 Exodus 23:8
  3. Ubuntu18.04安装nvidia 940mx显卡驱动
  4. 打开剑灵微端显示与服务器断开,剑灵洪门崛起微端一直掉线
  5. ipad可以分屏吗_oppo手机的分屏功能你使用过吗?可以同时打开两款软件互不影响!...
  6. [微小说]根际大战——守护圣树
  7. idea中使用maven配置sonar
  8. spring定时任务详解spring schedule和spring-quartz
  9. html文本框椭圆,怎么用css画椭圆?
  10. 绝地求生无法连接至远程计算机,绝地求生无法连接到steam网络完美解决办法