python设计模式:单例模式
理论
单例模式的特点是确保类只有一个实例化对象被创建,并让程序可以全局访问这个对象。
常用于日志记录、数据库操作、打印机后台处理程序等,这些程序在运行过程中只能生成一个实例,以避免对同一资源产生相互冲突的请求。
单例模式是一种经过时间考验的成熟方法,能够在不带来太多缺陷的情况下提供全局访问点。
实战
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设计模式:单例模式相关推荐
- Python设计模式-单例模式
Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...
- Python 设计模式: 单例模式(singleton pattern)
2019独角兽企业重金招聘Python工程师标准>>> 如果想在整个程序的运行过程中,某个类只有一个实例的话,可以通过单例模式来实现. 在 Python 中实现单例模式有很多种方式, ...
- python的编程模式-Python设计模式:为了整洁又时尚的代码
关键时刻,第一时间送达! 作者ANDREI BOYANOV - 高级软件工程师 @TOPTAL 让我们再重申一下:Python是一种具有动态类型和动态绑定的高级编程语言.我将它描述为一个强大的高级动态 ...
- python采用单例模式游戏_Python实现Singleton模式的方式详解
前言 使用python实现设计模式中的单例模式.单例模式是一种比较常用的设计模式,其实现和使用场景判定都是相对容易的.本文将简要介绍一下python中实现单例模式的几种常见方式和原理.一方面可以加深对 ...
- python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- 笔记:python设计模式
文章目录 概述 什么是设计模式 为什么使用设计模式 python设计模式 1. 策略模式 2. 适配器模式 3. 工厂模式 4. 装饰器模式 5. 单例模式 小结 概述 整理网上python设计模式资 ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- Python 实现单例模式
Python 实现单例模式 单例模式是一种软件设计模式. 在面向对象编程中,通过单例模式只能创建一个类实例,也就是一个类永远只有一个实例对象. 在工作中,为了确保某一个类只会创建出一个实例,就需要使用 ...
- 炒冷饭系列:设计模式 单例模式
2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...
- Python实现单例模式的几种方式
认识单例模式 含义 单例模式是一种常用的软件设计模式,在应用这个模式时,类只会生成一个实例对象. 换句话说,单例模式确保某个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例,当我们在程序中的 ...
最新文章
- Hibernate5-命名查询
- BSP二叉树的数学原理(绝对原创)
- python 遍历文件 获取文件修改时间
- Java工程中引用Base64编码解码小记
- [YTU]_2444(C++习题 对象转换)
- [智力问答] 十个最难的字 你认识几个
- apache lucene_全文搜索Apache Lucene简介
- 邮箱如何秘密发送多个人邮件_如何发送秘密消息
- 网络协议,各层功能,各层协议
- 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了!
- 1008.protobuf语句内存对齐的错误
- 大数据之-Hadoop之HDFS的API操作_写数据流程_上传数据原理剖析_案例---大数据之hadoop工作笔记0066
- 安装以太坊客户端geth的方法
- 荣耀play3 鸿蒙,荣耀play系列跳过2直接上3代,999元的配置还能愉快play吗?
- Java陷阱一箩筐----面试题集
- [读书笔记] 机器学习 (一)绪论
- jq数组清空_JQuery 数组获取和删除元素
- ThingsBoard设备在线状态-active服务端属性分析
- 遭遇Trojan PSW OnlineGames Trojan HiJack a Trojan PSW ZhuXian
- 5T的资源大礼包整合,总有你想要的!