单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类始终只有一个实例存在。
我们都知道,每一次实例化一个对象,它们之间都是独立的。但有些应用场景:比如,全局就希望有一个实体存在,作为配置项等,也就是希望牵一发而动全身。
单例模式正好能解决。
单例模式实现一:__new__
class Singleton: _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: # 如果实例不存在 cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs) return cls._instance # 否则直接返回cls._instance
class Myclass(Singleton): pass mc1 = Myclass() mc2 = Myclass() print(id(mc1),id(mc2))
>>>2316670072480 2316670072480 # 看,共用一个实例对象
单例模式实现二:模块
重点:模块只导入一次。因为模块在第一次导入时,会生成
.pyc
文件,当第二次导入时,就会直接加载.pyc
文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
mysingleton.py
class My_Singleton(object): def foo(self): print("foo") my_singleton = My_Singleton() # 实例化一个对象
单例模式.py
from mysingleton import my_singleton # 导入模块中的实例对象 print(id(my_singleton)) from mysingleton import my_singleton print(id(my_singleton)) >>>2688065271400 # 共用一个实例对象 2688065271400
区分:
from mysingleton import My_Singleton # 导入模块中的类 mc1 = My_Singleton() mc2 = My_Singleton() print(id(mc1)) print(id(mc2))
前面导入模块的是一个实例对象,那这次导入的一个类,它们是否是一样的呢?
答案:不一样!看清楚,前面,我们导入是一个实例对象,因为模块导入的特殊性,我们都是共用的一个实例对象。而这次导入的是类,这样每次实例化时,都是独立的。