第一种__new__方法
#方法1,实现__new__方法
#因为__new__方法是实例化对象的方法,所以只需要对__new__方法进行限制就可以限制创造出来的对象了
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls)
return cls._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
two.a = 3
print one.a
2、根据共有属性来创造
#根据类中的共有的属性也是几乎和上面的__new__中
class Bord(object):
__state = {}
def __new__(cls, *args, **kwargs):
ob = super(Bord,cls).__new__(cls)
ob.__dict__ = cls.__state
return ob
def __init__(self,name):
self.name = name
def cal(self):
return self.name
al = Bord("老王")
el = Bord("老李")
print(al.cal())
print(el.cal())
用metaclass实现
class SingLeton(type):
def __init__(cls,name,bases,dict):
super(SingLeton,cls).__init__(name,bases,dict)
cls.___instance = None
def __call__(cls,*args,**kwargs):
if cls.___instance is None:
cls.___instance = super(SingLeton,cls).__call__(*args,**kwargs)
return cls.___instance
class Myclass(object):
__metaclass__ = SingLeton # 直接对你的这个类的原类进行修改,改变本身创建对象的规则
A = Myclass()
B = Myclass()
使用装饰器实现单例模式
def SingLeton(cls,*args,**kw):
instances = {}
def __singleton():
if cls not in instances:
instances[cls] = cls(*args,**kw)
return instances[cls]
return __singleton
@SingLeton
class MyClass(object):
a = 1
def __init__(self,x = 0):
self.x = x
one = MyClass()
two = MyClass()
*其实我想说 上面四种都是浪费 只是为了让你知道了解有这么四种方式实现的,但是呢实际开发中这四种不会让你去使用的,如果让你使用的公司你就可以考虑换一家了,因为技术真的不咋地,上面四种越是高大上动用底层来实现的 比如metaclass根本不应该动用他 万一出错了 那么就会对程序造成很大的影响
最好的实现单例模式的方式