1. 常见的单例模式
百度一下可以看到很多关于python单例模式的文档,比如:
class singleton(object):
_instance_lock = threading.Lock() #作用是保证多线程下类依然保证唯一性
def __init__(self, *args, **kwargs):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
with singleton._instance_lock:
if not hasattr(cls, '_instance'):
singleton._instance = super().__new__(cls)
return singleton._instance
但是上面的单例模式真的保证的唯一性,但是不能继承,继承的类都会属于一个类,如下图:
class Foo(singleton):
def __init__(self,name):
self.name = name
class test_cls1(singleton):
def __init__(self):
pass
class test_cls2(singleton):
def __init__(self):
pass
if __name__ == '__main__':
obj1 = Foo('name')
obj2 = Foo('name')
print(obj1)
print(obj2)
print(test_cls1())
print(test_cls1())
print(test_cls2())
print(test_cls2())
<__main__.Foo object at 0x7ff67e34c780>
<__main__.Foo object at 0x7ff67e34c780>
<__main__.Foo object at 0x7ff67e34c780>
<__main__.Foo object at 0x7ff67e34c780>
<__main__.Foo object at 0x7ff67e34c780>
<__main__.Foo object at 0x7ff67e34c780>
2. 可继承的单例模式
完全可以使用字典管理类,保证类本身的唯一性,并且具有可继承性。
class singleton(object):
_instance_lock = threading.Lock()
def __init__(self, *args, **kwargs):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance_dict'):
singleton.instance_dict = {}
if str(cls) not in singleton.instance_dict.keys():
with singleton._instance_lock:
_instance = super().__new__(cls)
singleton.instance_dict[str(cls)] = _instance
return singleton.instance_dict[str(cls)
和上面相同的测试代码结果如下:
<__main__.Foo object at 0x7f8809b9cf60>
<__main__.Foo object at 0x7f8809b9cf60>
<__main__.test_cls1 object at 0x7f8809b9c2e8>
<__main__.test_cls1 object at 0x7f8809b9c2e8>
<__main__.test_cls2 object at 0x7f8809bb58d0>
<__main__.test_cls2 object at 0x7f8809bb58d0>