Python下如何实现单例模式-创新互联
这篇文章给大家分享的是有关Python下如何实现单例模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
超过10余年行业经验,技术领先,服务至上的经营模式,全靠网络和口碑获得客户,为自己降低成本,也就是为客户降低成本。到目前业务范围包括了:网站设计、成都做网站,成都网站推广,成都网站优化,整体网络托管,小程序开发,微信开发,APP应用开发,同时也可以让客户的网站和网络营销和我们一样获得订单和生意!Python 下的单例模式
要点:
1.某个类只能有一个实例;
2.它必须自行创建这个实例;
3.它必须自行向整个系统提供这个实例
方法:重写new函数
应该考虑的情况:
1.这个单例的类可能继承了别的类
2.这个单例的类还有可能要接收参数来实例化
要点:
实例化的过程其实不是直接调用init的,首先是new分配一块空间来创建实例,再由init对这个实例进行初始化.我们无法阻止new和init的调用,我们只能是限制他们的内容,以此使他们能达到单例的目的
代码:
class people(object): def __new__(cls,*args,**kargs): return super(people,cls).__new__(cls) def __init__(self,name): self.name = name def talk(self): print("hello,I am %s" %self.name) class student(people): def __new__(cls,*args,**kargs): if not hasattr(cls,"instance"): cls.instance = super(student,cls).__new__(cls,*args,**kargs) return cls.instance a = student("Timo") print(a) b = student("kysa") c = student("Luyi") a.talk() b.talk() print(c)
这里的输出结果是:
<__main__.student object at 0x0000025AC48BF2E8>
hello,I am Luyi
hello,I am Luyi
<__main__.student object at 0x0000025AC48BF2E8>
可以确定的是: 确实是单例了,因为a的id和b,c的id是一致的
但是为什么:a先创建明明是Timo,可是为什么a的name变成了Luyi呢?
原因:
虽然确实是a这个实例,但是在最后c重新调用了new,返回了a的实例,再经过init,改变了a的属性,执行时name ->Luyi.
解决:
这种情况下,我们只需要设置类变量,让init在类变量的限制下,只对类进行一次有效的初始化.
代码:
class people(object): def __new__(cls,*args,**kargs): return super(people,cls).__new__(cls) def __init__(self,name): self.name = name def talk(self): print("hello,I am %s" %self.name) class student(people): def __new__(cls,*args,**kargs): if not hasattr(cls,"instance"): cls.instance = super(student,cls).__new__(cls,*args,**kargs) return cls.instance def __init__(self,name): if not hasattr(self,"init_fir"): self.init_fir = True super(student,self).__init__(name) a = student("Timo") print(a) b = student("kysa") c = student("Luyi") a.talk() b.talk() print(c)
感谢各位的阅读!关于“Python下如何实现单例模式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章题目:Python下如何实现单例模式-创新互联
标题来源:http://ybzwz.com/article/djjcss.html