Python 设计模式 -- 单例模式

来源:互联网 发布:上海市网络作家协会 编辑:程序博客网 时间:2024/06/01 12:18

Python 单例模式

单例模式的意思是在同一个运行环境中一个进程里面,这个类的实例只有一份,该实例也只会初始化一次。
python 语言的单例模式至少可以有4种实现方式:

1.使用__new__ 构造函数:

class Singleton(object):    __instance = None    def __new__(cls, *argv, **kwags):        if Singleton.__instance is None:            Singleton.__instance = object.__new__(cls, *argv, **kwags)        return Singleton.__instanceclass MyFoo(Singleton):    passf1 = MyFoo()f2 = MyFoo()print f1print f2>><__main__.MyFoo object at 0x7fd9f2a96110><__main__.MyFoo object at 0x7fd9f2a96110>

2.使用python装饰器实现:

def singleton(cls):    __instance = {}    def _singleton(*argv, **kwags):        if cls not in __instance:            __instance[cls] = cls(*argc, **kwags)        return __instance[cls]    return _singleton@singletonclass MyFoo(object):    def __init__(self, age):        self.age = agef1 = MyFoo(12)f2 = MyFoo(13)print f1print f2print f1.ageprint f2.age>><__main__.MyFoo object at 0x7fab563f4150><__main__.MyFoo object at 0x7fab563f4150>1212

3.使用import的方式:

#mySingleClass.pyclass MySingleClass(object):    def __init__(self):        passsingle_instance = MySingleClass()#test.pydef func1():    from mySingleClass import single_instance    print(single_instance)def func2():    from mySingleClass import single_instance    print(single_instance)func1()func2()>><mySingleClass.MySingleClass object at 0x7f13fa14e210><mySingleClass.MySingleClass object at 0x7f13fa14e210>

4.共享属性:

创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
这种方式和前面3种方式并不能相提并论,我觉得它根本没有实现正真意义上的单例,因为它实例化的时候创建的是id不同的实例,虽然指向了相同的__dict__。不推荐这种方式,有误导性。

class Singleton(object):    __global_dict = {}    def __new__(cls, *args, **kwags):        __instance = object.__new__(cls, *args, **kwags)        __instance.__dict__ = Singleton.__global_dict        return __instanceclass MyFoo(Singleton):    def __init__(self, name):        self.name = namef1 = MyFoo("Python")f2 = MyFoo("Java")print(f1)print(f2)print f1.nameprint f2.name>><__main__.MyFoo object at 0x7fdc1315c350><__main__.MyFoo object at 0x7fdc1315c390>JavaJava
原创粉丝点击