5种Python单例模式的实现方式
|
本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次。
class Singleton(object):
def __new__(cls,*args,**kwargs):
if not hasattr(cls,'_inst'):
cls._inst=super(Singleton,cls).__new__(cls,**kwargs)
return cls._inst
if __name__=='__main__':
class A(Singleton):
def __init__(self,s):
self.s=s
a=A('apple')
b=A('banana')
print id(a),a.s
print id(b),b.s
结果:
class Borg(object):
_shared_state={}
def __new__(cls,**kwargs):
obj=super(Borg,**kwargs)
obj.__dict__=cls._shared_state
return obj
将所有实例的__dict__指向同一个字典,这样实例就共享相同的方法和属性。对任何实例的名字属性的设置,无论是在__init__中修改还是直接修改,所有的实例都会受到影响。不过实例的id是不同的。要保证类实例能共享属性,但不和子类共享,注意使用cls._shared_state,而不是Borg._shared_state。
if __name__=='__main__':
class Example(Borg):
pass
a=Example()
b=Example()
c=Example()
adict={}
j=0
for i in a,b,c:
adict[i]=j
j+=1
for i in a,c:
print adict[i]
结果:
class Borg(object):
_shared_state={}
def __new__(cls,**kwargs)
obj.__dict__=cls._shared_state
return obj
def __hash__(self):
return 1
def __eq__(self,other):
try:
return self.__dict__ is other.__dict__
except:
return False
if __name__=='__main__':
class Example(Borg):
pass
a=Example()
b=Example()
c=Example()
adict={}
j=0
for i in a,c:
print adict[i]
结果:
class Singleton(type):
def __init__(self,name,bases,class_dict):
super(Singleton,self).__init__(name,class_dict)
self._instance=None
def __call__(self,**kwargs):
if self._instance is None:
self._instance=super(Singleton,self).__call__(*args,**kwargs)
return self._instance
if __name__=='__main__':
class A(object):
__metaclass__=Singleton
a=A()
b=A()
print id(a),id(b)
结果:
class _singleton(object):
class ConstError(TypeError):
pass
def __setattr__(self,value):
if name in self.__dict__:
raise self.ConstError
self.__dict__[name]=value
def __delattr__(self,name):
if name in self.__dict__:
raise self.ConstError
raise NameError
import sys
sys.modules[__name__]=_singleton()
python并不会对sys.modules进行检查以确保他们是模块对象,我们利用这一点将模块绑定向一个类对象,而且以后都会绑定向同一个对象了。 >>> import single >>> single.a=1 >>> single.a=2 ConstError class singleton(object): pass singleton=singleton() 将名字singleton绑定到实例上,singleton就是它自己类的唯一对象了。 以上就是Python单例模式的实现方式详细介绍,希望对大家的学习有所帮助。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
