单例模式实现方式(Python如何实现单例模式)

2025-03-03 06:00:01 0

单例模式实现方式(Python如何实现单例模式)

本文目录

Python如何实现单例模式

有些时候你的项目中难免需要一些全局唯一的对象,这些对象大多是一些工具性的东西,在Python中实现单例模式并不是什么难事。以下总结几种方法:使用类装饰器使用装饰器实现单例类的时候,类本身并不知道自己是单例的,所以写代码的人可以不care这个,只要正常写自己的类的实现就可以,类的单例有装饰器保证。def singleton(cls):instances = {}def _wrapper(*args, **kwargs):if cls not in instances:instancesreturn _wrapper你会发现singleton装饰器内部使用了一个dict。当然你也可以用其他的方式,不过以下的实现是错误的:def singleton(cls):_instance = None #外部作用域的引用对于嵌套的内部作用域是只读的def _wrapper(*args, **kwargs):if _instance is None: #解释器会抛出“UnboundLocalError: ...referenced before assignment“_instance = cls(*args, **kwargs) #赋值行为使解释器将“_instance“看作局部变量return _instancereturn _wrapper使用元类(__metaclass__)和可调用对象(__call__)Python的对象系统中一些皆对象,类也不例外,可以称之为”类型对象”,比较绕,但仔细思考也不难:类本身也是一种对象,只不过这种对象很特殊,它表示某一种类型。是对象,那必然是实例化来的,那么谁实例化后是这种类型对象呢?也就是元类。Python中,class关键字表示定义一个类对象,此时解释器会按一定规则寻找__metaclass__,如果找到了,就调用对应的元类实现来实例化该类对象;没找到,就会调用type元类来实例化该类对象。__call__是Python的魔术方法,Python的面向对象是”Duck type”的,意味着对象的行为可以通过实现协议来实现,可以看作是一种特殊的接口形式。某个类实现了__call__方法意味着该类的对象是可调用的,可以想像函数调用的样子。再考虑一下foo=Foo()这种实例化的形式,是不是很像啊。结合元类的概念,可以看出,Foo类是单例的,则在调用Foo()的时候每次都返回了同样的对象。而Foo作为一个类对象是单例的,意味着它的类(即生成它的元类)是实现了__call__方法的。所以可以如下实现:class Singleton(type):def __init__(cls, name, bases, attrs):super(Singleton, cls).__init__(name, bases, attrs)cls._instance = Nonedef __call__(cls, *args, **kwargs):if cls._instance is None# 以下不要使用’cls._instance = cls(*args, **kwargs)’, 防止死循环,# cls的调用行为已经被当前’__call__’协议拦截了# 使用super(Singleton, cls).__call__来生成cls的实例cls._instance = super(Singleton, cls).__call__(*args, **kwargs)return cls._instanceclass Foo(object): #单例类__metaclass__ = Singleton》》》a = Foo()》》》b = Foo()》》》a is b》》》True》》》a.x = 1》》》b.x》》》1使用__new____init__不是Python对象的构造方法,__init__只负责初始化实例对象,在调用__init__方法之前,会首先调用__new__方法生成对象,可以认为__new__方法充当了构造方法的角色。所以可以在__new__中加以控制,使得某个类只生成唯一对象。具体实现时可以实现一个父类,重载__new__方法,单例类只需要继承这个父类就好。class Singleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls, ’_instance’):cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return cls._instanceclass Foo(Singleton): #单例类a = 1

如何实现单例模式

这个模式保护类的创建过程来确保只有一个实例被创建,它通过设置类的构造方法为私有来达到这个目的。 要获得类的实例,单例类可以提供一个方法,如getInstance,来返回类的实例。该方法是唯一可以访问类来创建实例的方法。 下面是单例的一个例子:Java代码publicclassSingletonPattern{privatestaticSingletonPatterninstance;privateSingletonPattern(){}publicstatic synchronized SingletonPatterngetInstance(){if(instance==null){instance=newSingletonPattern();}returninstance;}} 当我们要实现单例的时候,有如下的规则需要遵循: 从上面的示例代码中可以看出,一个单例类有一个静态的属性来保存它唯一的实例 需要将类的构造方法设置为private。这样你不允许其他任何类来创建单例类的实例,因为它们不能访问单例类的构造方法。

android 几种单例模式的写法

先不论单例模式的写法,有些方面是相同的,比如都需要将唯一的对象设置为static的,都需要将构造方法private化,代码如下:public class MyInstance { private static MyInstance instance; private MyInstance(){}}第一种:最原始的单例模式,代码如下:public static MyInstance getInstance(){ if(instance==null){ instance=new MyInstance();} return instance;}多线程并发时,可能会出现重复new对象的情况,因此不提倡使用。第二种:将整个方法块进行加锁,保证线程安全。public static synchronized MyInstance getInstance(){ if(instance==null){ instance=new MyInstance();} return instance;}这种代码下,每条线程都会依次进入方法块内部,虽然实现了单例,但是影响了运行效率,可以使用但是也不怎么提倡。第三种:进一步优化的方法。public static MyInstance getsInstance(){ synchronized (MyInstance.class){ if(instance==null){ instance=new MyInstance(); return instance;}else{ return instance;}}}这种方式只是第二种方法的一种优化,但是优化有限。(以下的几种方法比较推荐使用)第四种:双层判断加锁,效率影响小且保证了线程安全。public static MyInstance getsInstance() { if (instance == null) { synchronized (MyInstance.class) { if(instance==null){ instance=new MyInstance();}}} return instance;}这种方法是对第二种和第三种方法的进一步优化,比较推荐使用。第五种:内部类实现单例,不用线程锁来实现效率的提升。public class MyInstance { private MyInstance() {} public static MyInstance getInstance(){ return MyInstanceHolder.instance;} private static class MyInstanceHolder{ private static MyInstance instance=new MyInstance();}}在内部类中new对象,再将内部类的对象返回,这种方法是使用了java中class加载时互斥的原理来实现了线程的安全。不加线程锁也使得运行效率不会受到较大的影响。比较提倡。

单例模式实现方式(Python如何实现单例模式)

本文编辑:admin

更多文章:


免费音效素材网站(请大家提供几个好的CG素材网站和音效网站!谢谢)

本文目录请大家提供几个好的CG素材网站和音效网站!谢谢有没有哪种专门的音效素材下载的网站啊请大家提供几个好的CG素材网站和音效网站!谢谢可以到这几个地方找到你需要的各种免费音效素材和声音资源:『声音搜索引擎』淘声网toSound:CC协议+

2025年4月6日 09:40

java是什么专业(我想学java但是学历不是很高,适不适合学啊)

本文目录我想学java但是学历不是很高,适不适合学啊自己的java技术是培训机构学出来的,大学学的不是这个专业,那么到时候面试找工作该怎么说呢计算机Java专业未来前景如何请问什么样的人比较适合学Java我想学java但是学历不是很高,适不

2025年2月13日 11:10

系统分析师教程(最新的系统分析师教程)

本文目录最新的系统分析师教程系统分析师教程 书怎么样考系统分析师需要哪些图书系统分析师教程的目 录系统分析师备考如何学习啊凭系统分析师实在进步吗系统分析师教程的介绍最新的系统分析师教程数千 G 的各种视频培训资料 ( 学习 , 职场 , 商

2025年3月1日 01:20

maven仓库地址(如何搭建自己的Maven远程私仓)

本文目录如何搭建自己的Maven远程私仓android工程使用maven的多吗如何搭建自己的Maven远程私仓谢邀,在实际开发过程中,可能会遇到上述你说的各种情况,所以通常的作法是:在Maven配制的时候,除了要配制Maven中央仓库外,还

2025年4月8日 05:10

lumaqq(为什么下下来的lumaqq安装包,装完后点了没反应阿)

本文目录为什么下下来的lumaqq安装包,装完后点了没反应阿lumaQQ好还是gaimQQ好Lumaqq是什么谁会用LumaQQLumaQQ具体如何使用为什么下下来的lumaqq安装包,装完后点了没反应阿./configure估计要出问题,

2025年2月21日 15:50

单片机c语言(一个完整的单片机c语言程序包含哪几个部分)

本文目录一个完整的单片机c语言程序包含哪几个部分C语言怎么用到单片机C语言与单片机C语言的区别 急求51单片机c语言是什么意思单片机和C语言编程学习之间有什么联系呢单片机c语言C语言与单片机C语言的区别是什么单片机c语言是什么意思PIC单片

2025年3月27日 13:10

offsetleft和offsetwidth(如何获取页面中任意元素的offsetLeft和offsetTop)

本文目录如何获取页面中任意元素的offsetLeft和offsetTopoUl.style.width和oUl.offsetWidth的区别感觉有点乱如何获取页面中任意元素的offsetLeft和offsetTop其中要注意的地方是:1、o

2025年4月5日 15:00

花生壳2008(花生壳2008版是病毒)

本文目录花生壳2008版是病毒打不开花生壳客户端 2008有会用2008花生壳域名软件的朋友来用花生壳,远程读取本地sql2008数据花生壳2008怎么使用代理服务器花生壳2008和端口映射的问题为什么我的花生壳总是连接失败啊花生壳是什么干

2025年3月27日 17:10

the service is unavailable(the service is unavailable.是什么意思)

本文目录the service is unavailable.是什么意思http error 503.the service is unavailable是什么意思http error 503.the service is unavaila

2025年3月4日 00:30

socket error 11004(统一加速器出现Socket Error #11004 要咋么办)

本文目录统一加速器出现Socket Error #11004 要咋么办网络显示连接上,但是不能上网,出现:socket errorSocket Error 11004的报错的原因是什么为什么老出现Socket error,是什么意思啊统一加

2025年2月22日 21:00

cad教程ppt(怎样将CAD的图弄到PPT里)

本文目录怎样将CAD的图弄到PPT里CAD图像怎么导入PPT中去cad2004教程ppt谁有cad教程,要ppt版本的,麻烦给个下载地址怎样将CAD的图弄到PPT里1、可以在PPT中用插入-对象-在弹出的插入对象对话框中选择AutoCAD图

2025年2月27日 23:10

dns怎么设置(DNS怎么设置.)

本文目录DNS怎么设置.如何修改手机的dns网络dns怎么设置wifi dns怎么设置怎样设置正确的dnsDNS怎么设置.在修改DNS之前我们需要先知道我们的DNS服务器地址是什么,那么我们怎么来查询我们的DNS服务器地址呢?在“开始”中找

2025年2月24日 17:20

js代码用什么编写(js代码怎么写)

本文目录js代码怎么写JS代码是什么意思js代码怎么写建议楼主看下js基础每一项都是js使用中的小技巧,基础但十分的实用!1.document.write(““); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:documen

2025年2月21日 07:40

nap是什么意思中文(nap是什么意思,nap的解释)

本文目录nap是什么意思,nap的解释nap中文意思是什么nap是什么意思,nap的解释napn.(日间的)小睡,打盹;(某些织物表面的)短绒毛;赛马情报;赛马结果预测v.打盹,小睡(尤指日间)英英释义noun1、a card game s

2025年3月10日 05:50

想请问一下,写作的时候如何积累素材,或者哪里有好的素材可以参考学习?好用的设计素材网站是哪个

本文目录想请问一下,写作的时候如何积累素材,或者哪里有好的素材可以参考学习好用的设计素材网站是哪个想练短视频剪辑,那短视频素材从哪里获得做情感视频去哪里找视频素材好的设计素材网站有哪些呀谢谢MAD 动漫素材在哪里找把素材导入Adobe An

2025年4月5日 06:20

tcp连接的建立过程(TCP如何建立/拆除连接的方法)

本文目录TCP如何建立/拆除连接的方法谁知道 ..描述TCP建立连接的过程TCP/IP 建立连接的过程(3-way shake)t pc建立链接的过程称为TCP/IP通信建立的过程是什么简述TCP连接建立与断开的过程TCP连接包括哪三个过程

2025年2月8日 17:30

timeouts篮球(篮球比赛中(NBA)官方暂停是)

本文目录篮球比赛中(NBA)官方暂停是NBA篮球赛一节可以叫几次暂停篮球timeouts什么意思NBA的篮球赛中的比赛短和长暂停各有多少个时间又各是多少篮球的规则(用英语的,100词左右)篮球比赛中(NBA)官方暂停是NBA官方暂停 官方

2025年2月11日 00:40

mysql sql语句大全(求推荐偏向Mysql的SQL语句学习丛书)

本文目录求推荐偏向Mysql的SQL语句学习丛书一条SQL语句在MySQL中是如何执行的求推荐偏向Mysql的SQL语句学习丛书直接看mysql的书吧,kindel上有深入浅出MySQL:数据库开发、优化与管理维护(第2版)唐汉明 和更多

2025年2月17日 08:10

java handler(java mina中handler对象是单例吗)

本文目录java mina中handler对象是单例吗handler使用在哪些场景安卓开发,java线程报错的问题,handler空指针Java代理的作用和实现java日志中的处理者(handler)问题请问,谁有java日志中的处理者(h

2025年4月10日 05:30

switch破解(如何看待国行Switch已经被破解)

本文目录如何看待国行Switch已经被破解switch 破解 能玩哪些游戏switchlite大气层破解是什么意思switch怎么破解如何看待国行Switch已经被破解国行Switch已经被破解提高了稳定性。国外著名破解团队Team-Xec

2025年4月9日 04:40

近期文章

本站热文

2025-02-22 17:40:03 浏览:18
2025-02-10 23:40:06 浏览:7
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索