🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 单例模式 > ​ 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。 > > `__new__()`在`__init__()`之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例**这个绝对常考啊.绝对要记住1~2个方法,当时面试官是让手写的.** ### [](https://github.com/taizilongxu/interview_python#1-%E4%BD%BF%E7%94%A8__new__%E6%96%B9%E6%B3%95)1 使用`__new__`方法 ~~~python class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance class MyClass(Singleton): a = 1 ~~~ ### [](https://github.com/taizilongxu/interview_python#2-%E5%85%B1%E4%BA%AB%E5%B1%9E%E6%80%A7)2 共享属性 创建实例时把所有实例的`__dict__`指向同一个字典,这样它们具有相同的属性和方法. ~~~python class Borg(object): _state = {} def __new__(cls, *args, **kw): ob = super(Borg, cls).__new__(cls, *args, **kw) ob.__dict__ = cls._state return ob class MyClass2(Borg): a = 1 ~~~ ### [](https://github.com/taizilongxu/interview_python#3-%E8%A3%85%E9%A5%B0%E5%99%A8%E7%89%88%E6%9C%AC)3 装饰器版本 ~~~python def singleton(cls): instances = {} def getinstance(*args, **kw): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return getinstance @singleton class MyClass: ... ~~~ ### [](https://github.com/taizilongxu/interview_python#4-import%E6%96%B9%E6%B3%95)4 import方法 作为python的模块是天然的单例模式 ~~~python # mysingleton.py class My_Singleton(object): def foo(self): pass my_singleton = My_Singleton() # to use from mysingleton import my_singleton my_singleton.foo() ~~~ **[单例模式伯乐在线详细解释](http://python.jobbole.com/87294/)**