使用__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