理解单例模式

之前很长一段时间,对于单例模式一直理解不了,什么是单例模式,查阅了很多文档,都没有说明白,今天再次看单例模式,豁然开朗.用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
posted @ 2020-11-30 16:12  进击的pythoner  阅读(125)  评论(0编辑  收藏  举报