🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
##   介绍   **单例模式(Singleton Pattern)**是一种常用的软件设计模式,该模式的主要目的是确保**某一个类只有一个实例存在**。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。 ##   单例模式的实现 ### 方式一:python就是天然的单例模式   其实,**Python 的模块就是天然的单例模式**,因为模块在第一次导入时,会生成 `.pyc` 文件,当第二次导入时,就会直接加载 `.pyc` 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。 ``` ~~~ class Person(): def foo(self): pass p1 = Person() ~~~ ```   在另一个文件中导入使用就可以了。 ~~~ from a.b import p1 print(id(p1.foo())) ~~~   你会发现,不管使用多少次,或者在几个文件中引用,每次打印的id都是相同的。 ### 方式二:使用装饰器 ~~~ def outer(cls): instance = None def inner(*args,**kwargs): nonlocal instance if instance == None: instance = cls(*args,**kwargs) return instance return inner @outer class Person(): def __init__(self): pass p1 = Person() p2 = Person() print(id(p1)) print(id(p2)) ~~~ id打印结果 ![](https://img.kancloud.cn/26/d9/26d90c7d644d5f3cf678941394728955_859x161.png) ### 方式三:用\_\_new\_\_方式实现单例模式   我们知道,当我们实例化一个对象时,是**先执行了类的\_\_new\_\_方法**(我们没写时,默认调用object.\_\_new\_\_),**实例化对象**;然后**再执行类的\_\_init\_\_方法**,对这个对象进行初始化,所有我们可以基于这个,实现单例模式。 ~~~ class Person(object): __instance = None def __new__(cls, *args, **kwargs): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance def __init__(self): pass p1 = Person() p2 = Person() print(id(p1)) print(id(p2)) ~~~ id打印结果 ![](https://img.kancloud.cn/cb/57/cb579e648000eb568d0953864ce11b87_906x139.png) 好了,先介绍这三种吧,python实现单例模式方式有很多,以后慢慢补。 # 未完待续。。。