小猿圈python之实现单例模式的两种方法

小猿圈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讲的单例实现的内容。

猜你喜欢

转载自www.cnblogs.com/xiaoyuanquan/p/10943782.html