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)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
随机推荐
- Azure School,让系统化学习回归一站式的简单体验
承认吧,「终身制学习」已经成为一个不可抵挡的趋势.不管你从事什么行业,几乎已经没有什么可以一直吃老本就能搞定的事情,总有各种新的技术和概念等着你去学.至于发展速度飞快的IT 技术,不断的学习更是贯彻始 ...
- SQLServer从其他表获取的数据更新该表的一部分
在网上常见的是update a set username = username FROM b on a.userid=b.userid,该更新语句是对a表中所有行进行更新.如果只更新一部 ...
- Python开发第二篇
运算符 1.算术运算符 % 取余运算符,返回余数 ** 幂运算符 //返回商的整数部分 2.逻辑运算符 and 与运算符 a and b 如果a为False是,表达式为False,如果a为True返 ...
- Spark的调度
作业调度简介 设计者将资源进行不同粒度的抽象建模,然后将资源统一放入调度器,通过一定的算法进行调度,最终要达到高吞吐或者低访问延时的目的. Spark在各种运行模式中各个角色实现的功能基本一致,只不过 ...
- vs code vim
很多初学者启动vim后,不知道怎么输入字符:按了半天字母,结果屏幕还是空的. vim和记事本或WORD不一样,不是一打开后就可以输入文字,此时它处于正常模式. vim一共有4个模式: 正常模式 (No ...
- 踩坑日志!viser-ng的使用
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
- bootstrap table加载数据
//html <table id="dailyDevTable"></table> //js $(function () { initTable(); }) ...
- C# 文件操作 常用的类
File------实用类,提供许多静态方法,用于移动.删除.和复制文件. Directory------实用类,提供许多静态方法,用于移动.删除和复制目录. Path------ 实用类,用于处理路 ...
- 移动端rem匹配
Rem是相对于根元素font-size大小的单位 记inphone5屏幕宽度是 320px font-size16px 1rem=16px <html> <head> ...
- iOS开发——应用间跳转
iOS开发过程中,我们经常碰到应用间跳转的情景: 1.使用第三方用户登录,跳转到需授权的App或跳转到分享app的对应页面 *需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名.密 ...