理解单例模式
之前很长一段时间,对于单例模式一直理解不了,什么是单例模式,查阅了很多文档,都没有说明白,今天再次看单例模式,豁然开朗.用py实现的单例模式,
方法1.对类的__new__方法进行重写,
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
return cls._instance
class MyClass(Singleton):
a = 1
a = MyClass()
b = MyClass()
a.a = 3
print(b.a)
# 3
实例初始完时候,其中one,two两个实例对象是相同的,见下图中的红色边框里面的内容.即这个类只有一个类实例
即: 所谓单例就是所有引用(实例、对象)拥有相同的状态(属性)和行为(方法)
------------------------------------------------------------------------------------
如果对a这个实例进行值修改,都只会应用最后一个实例对象进行的福祉.见下图
------------------------------------------------------------------------------------------------------------------------------------
2.用字典的方式来实现单例模式
创建实例时把所有实例的__dict__
指向同一个字典,这样它们具有相同的属性和方法.
class SingtonDict(object): _state = {} def __new__(cls, *args, **kwargs): orig = super(SingtonDict, cls).__new__(cls, *args, **kwargs) orig.__dict__ = _state
return orig class MyClass2(SingtonDict): a = 8
通过下面的代码发现,当默认的a属性被修改的时候,都有的实例对象都会发生改变,通过MyClass2().a的结果可以看出来.
当给a,b进行新属性赋值的时候,由于他们的属性和方法都通过__dict__进行共享,所以后面实例对象改变的值,会覆盖前面修改的值.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.通过装饰器来实现单例模式.核心还是判断这个类是否存在
def singleton(cls):
instance = {}
def getinstance(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return getinstance
@singleton
class MyClass2(object):
a = 10
本博客的内容如果没有标注转载字样,均属个人原创!欢迎学习交流,如果觉得有价值,欢迎转载,转载请注明出处,谢谢!