小猿圈alex讲了实现单例模式的好几种方法,小编把最经典,也是最经常用的两种实现单例模式的方法呈现给大家,如果想学其他的单例,可以去小猿圈看一下alex的课程,学习一下。
单例顾名思义就是这个类只能创建一个实例,那怎么创建呢?
1、__new__实现单例:
1 class Foo(object): 2 def __init__(self,name): 3 4 self.name=name 5 6 def __new__(cls,*args,**kwargs): 7 8 if not hasattr(cls,instance): #对象不存在instance属性 9 10 cls.instance=super().__new__(cls,*args,**kwargs) 11 12 return cls.instance #创建了一个实例,还没初始化对象 13 14 f=Foo('hello') 15 16 f1=Foo('hi') 17 18 f.name=hello f1.name=hi 19 20 id(f)==id(f1)
地址没变 属性变了
2、使用装饰器实现的单例:
1 class Demo(cls,*ags,**kwargs): 2 instance={} 3 4 def foo(*args,**kwargs): 5 6 if cls not in instance: 7 8 instance[cls]=cls(*args,**kwargs)#具体的实例(已经初始化好的实例对象) 9 10 return instance[cls] 11 12 return foo 13 14 @Demo 15 16 class School(object): 17 18 def __init__(self,name) 19 20 self.name=name 21 22 s=School('hafo') 23 24 s1=School('qinghua') 25 26 s.name=hafo s1.name=hafo s1==s
地址没变,属性也没变
朋友们看出两者实现单例的异同点了吗?虽然两者都可以实现单例,但是__new__实现的单例,虽然只能实现一个实例但是属性改变了,装饰器实现的单例,可以保证id和属性都保持一个,如果朋友们对其他的单例之间不同感兴趣,可以去小猿圈看一下alex讲的单例实现的内容。