一、单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。
许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
在new方法中把类实例绑定到类变量_instance上,如果cls._instance为None表示该类还没有实例化过,实例化该类并返回。如果cls_instance不为None表示该类已实例化,直接返回cls_instance.
class SingleTon(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, "_instances"): # 查看当前类中是否有_instances这个变量 cls._instances = object.__new__(cls, *args, **kwargs) return cls._instances class TestClass(SingleTon): a = 1 test1 = TestClass() test2 = TestClass() print(test1.a, test2.a) test1.a = 2 print(test1.a, test2.a) print(id(test1.a), id(test2.a))
三、使用装饰器(decorator)
def SingleTon(cls, *args, **kwargs): instance = {} def _singleton(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return _singleton @SingleTon class TestClass(object): a = 1 test1 = TestClass() test2 = TestClass() print(test1.a, test2.a) test1.a = 2 print(test1.a, test2.a) print(id(test1.a), id(test2.a))
四、python模板
class My_SingleTon(object): def foo(self): pass my_sign = My_SingleTon() my_sign.foo()