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)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
随机推荐
- redis在Windows下以后台服务一键搭建集群(多机器)
redis在Windows下以后台服务一键搭建集群(多机器) 一.概述 此教程介绍如何在windows系统中多台机器之间布置redis集群,同时要以后台服务的模式运行.布置以脚本的形式,一键完成.多台 ...
- HDU 1114 Piggy-Bank 猪仔储钱罐(完全背包)
题意: 给定一个存钱罐中要存硬币,知道空罐的重量和欲装满的重量,是否能装入?若能,打印最小价值.(注:能装的硬币重量一定刚刚好,里面的总价值要达到最小) 输入: 包含了T个测试例子,在第一行给出.接下 ...
- UVA Live Archive 4015 Cave (树形dp,分组背包)
和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...
- 从用户访问网站流程开始,细说web网络基础
1.用户访问网站流程框架 2.dns解析原理 3.tcp/ip三次握手过程原理,11种连接状态 4.tcp/ip四次挥手过程原理,11种连接状态 5.http协议原理(www服务的请求过程)请求细节, ...
- java之接口相关知识
1.接口用interface来声明 //定义一个动物接口 public interface Animal{ public void eat(); public void travel(); } 2.接 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- Servlet 的生命周期 及 注意事项 总结
Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...
- c++question 005 c++中转义字符有哪些?
(1)'\a' 注意,这里不再是两个字符\ 和 a 而是表达了一个具体的含义是,蜂鸣一声 (2)'\n' 换行,这里不再是两个字符\ 和 n 而是表达了一个具体的含义是,相当于 endl (3)'\ ...
- Express中间件简单的实现原理
上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...
- 搭建mock服务器(微信小程序)
搭建mock服务器(微信小程序) 如何在微信小程序使用mock.js实在是个问题,为了完全模拟访问路由和数据,选择在搭建本地mock服务器是一个不错的选择. 以下示例了一个mock服务器的搭建过程以及 ...