Python单例模式的四种方法

在这之前,先了解_new__()方法

__new__方法:

a.是在实例创建之前被调用的

b.它的任务就是创建实例然后返回该实例,是个静态方法

 总结:

      __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

      __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

      __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

      我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

下面为四种实现单例模式的方法

1. 使用__new__方法

class MyClass:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

2.共享属性

# 创建实例时把所有实例的__dict__指向同一个字典,这样它们都具有相同的属性和方法(类的__dict__存储对象属性)
class Singleton(object):
    _state = {}
    def __new__(cls, *args, **kwargs):
        ob = super(Singleton,cls).__new__(cls, *args, **kwargs)
        ob.__dict__ = cls._state
    return ob

class B(Singleton):
    pass

# 类B即为单例类

 

3.使用装饰器

def singleton(cls):
    instance = {}
    def wapper():
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return wapper

@singleton
class C:
    pass

# 类C即为单例类

 

4.import方法

# 作为Python模块时是天然的单例模式

#创建一个sington.py文件,内容如下:
    class Singleton(object):
        def foo(self):
            pass
    mysington = Singleton()

# 运用
from sington import mysington
mysington.foo()

 

posted @ 2019-12-16 16:47  XIaoming·zhou  阅读(541)  评论(0编辑  收藏  举报