使用Python3 实现单例模式

使用__new__()实现:

class SingleTon:
    '''__new__()实现'''
    instance = None

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(cls)
        return cls.instance

if __name__ == '__main__':
    s1 = SingleTon()
    s2 = SingleTon()
    print(s1)
    print(s2)

其中对instance 数据类型选择可以使用字典:

class SingleTon(object):
    _instance = {}

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

使用装饰器实现:

def single_ton(cls):
    instance = []
    def single(*args, **kwargs):
        if len(instance)==0:
            instance.append(cls(*args, **kwargs))
        return instance[0]
    return single

instance 可以使用字典:

def single_ton(cls):
    _instance = {}

    def single(*args, **kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]
    return single

但是此处instance 改成 instance=None,再仿照第一段代码那么写就会在装饰器内层函数提示引用未声明,不知道为啥。希望各位大佬指点一下。(已解决,外层函数和内层函数中同时加global,只在内层函数加会报错。)

使用模块实现单例模式:

# use_module.py
class SingleTon(object):

    def __init__(self, val):
        self.val = val

single = SingleTon(2)

# test_module.py
from use_module import single

a = single
b = single
print a.val, b.val
print a is b
a.val = 233
print a.val, b.val

 

你可能感兴趣的:(使用Python3 实现单例模式)