python 中单例模式
1、什么是单例模式:
单例模式是指一个类有且只有一个实例对象,创建一个实例对象后,再创建实例是返回上一次的对象引用。(简单的讲就是两个实例对象的ID相同,节省了内存空间)
2、单例模式的创建:
举例创建一个类,比如宇宙只有一个地球,帮助理解单例模式
class Earth:
pass
a=Earth()
print(a)
b=Earth()
print(b)
*****结果******
32096552
32096496
我们可以看出两个实例内存ID不相同,该类不是一个单例模式
那么怎么能够让类只创建一个实例,而后再创建的实例是返回上一次的对象的引用呢?
我们了解到,python中,一个类创建对象实例是通过调用父类object的 __new__(cls)方法来创建对象的
我们可以通过重写 __new__(cls)方法去实现类只创建一个实例:
class Earth(object):
__instance=None
def __new__(cls):
if cls.__instance==None:#如果__instance为空证明第一次创建实例
cls.__instance=object.__new__(cls)
return cls.__instance
else:
#如果不是第一次创建实例,返回上一次的对象引用
return cls.__instance
a=Earth()
print(id(a))
b=Earth()
print(b)
******结果*****
1730389200
1730389200
上面例子我们通过__new__方法创建了一个单例模式类,但是该单例类再使用多线程是会存在一定问题。我们需要加入互斥锁的方式解决该问题。
import threading
class Earth(object):
_instance_lock=threading.Lock()
def __init__(self):
pass
def __new__(cls,*args,**kwargs):
if not hasattr(Earth,'_instance'):
with Earth._instance_lock:
if not hasattr(Earth,'_instance'):
Earth._instance=object.__new__(cls)
return Earth._instance
a=Earth()
b=Earth()
print(a,b)
def task(arg):
obj=Earth()
print(obj)
for i in range(10):
t=threading.Thread(target=task,args=[i,])
t.start()
*****结果*****
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
<__main__.Singleton object at 0x00000000029D06A0>
3、创建单例的其他方法:1、使用模块、2使用装饰器 3、使用类的方式4、基于metaclass方式
具体参考博客:https://www.cnblogs.com/huchong/p/8244279.html
python 中单例模式的更多相关文章
- Python中单例模式的使用方法
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场 ...
- Python 中单例模式 4种方法
假设我们在一个与数据库交互的系统中,需要进行数据库操作,那么我们就有必要了解单例模式,单例模式使得我们不用每次进行数据库的操作时都去链接数据库. 我将循环渐进,由浅入深的写一下单例模式示例. 实例1: ...
- python中单例模式的创建
# 单例模式(使用装饰器) def singleton(cls): instance = {} def wrapper(*args,**kwargs): if cls not in instance: ...
- python中单例模式的四种实现方式
配置文件settings.py IP='100.0.0.2' PORT=3302 方式一:绑定给类的方法 class Mysql: __instance = None def __init__(sel ...
- Python中的单例模式——装饰器实现剖析
Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性. 单例模式定义:具有该模式的类只能生成一个实例对象. 先将 ...
- 【Python】单例模式Singleton
前两天一个面试被问到python中单例模式有几种实现方式,只答出了可以用元类实现...然后就想不起来了. 之后翻书,原来这些之前都见过的啊.... 1.手动实现真正创建实例的方法__new__()来实 ...
- Python中的单例模式
在 Python 中,我们可以用多种方法来实现单例模式: 使用模块 使用 __new__ 使用装饰器(decorator) 使用元类(metaclass) # mysingleton.py class ...
- Python中的单例模式的几种实现方式的优缺点及优化
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- Python 中的单例模式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
随机推荐
- LeetCode Remove Duplicates from Sorted Array删除整型数组中的重复元素并返回剩下元素个数
class Solution { public: int removeDuplicates(int A[], int n) { ],*e=&A[]; //s指向开头第一个,e往后遍历相同的 i ...
- 【Python音乐生成】这是一个超棒的dataset
http://colinraffel.com/projects/lmd/
- 【洛谷1967】货车运输(最大生成树+倍增LCA)
点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...
- 为项目创建podfile
由于写项目 不常用到,容易忘记,记录一下 第一步:新建一个项目: 第二步:打开终端,输入 cd 第三步:把项目拖入终端,(获取项目路径) 第四步:回车,输入 pod init (生成podfile 文 ...
- API调用微信getWXACodeUnlimit()获取小程序码
微信文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/qr-code/getWXACodeUnlimit.html? ...
- Oracle分页抽数存储过程
--outTotal是需要返回的总数,v_loginUserId是传入的登录人ID,抽取他的客户,v_CurrPage是传入的第几页,v_pageSize传入的每页数据条数. ) FROM tb_cu ...
- Jquery 就是怎么取得一个select的当前值
<select id="cursel">: <option value="1">值1</option>: <optio ...
- 第一篇:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte
需求:python如何实现普通用户登录服务器后切换到root用户再执行命令 解决参考: 代码: def verification_ssh(host,username,password,port,roo ...
- python之质数
质数(prime number)又称素数,有无限个 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 示例: num=[]; i=2 for i in range(2,100): j= ...
- 4-8 string
1.常用的string模块 import string # 26个小写字母 print(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz # 2 ...