单例模式
1.什么是单例模式
确保一个类只有一个实例对象。
2.为什么用单例模式
在日常电脑使用中,往往会用到任务管理器,回收站等等,这些程序在操作系统中就是唯一的。这样就不会让系统中出现多个相同程序导致内存资源的浪费。
实现单例模式的几种方式
1.使用模块
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
mysingleton.py
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象
from mysingleton import singleton
2.基于new方法实现(推荐)
我们知道,当我们实例化一个对象时,是先执行了类的new方法(我们没写时,默认调用object.new),实例化对象;然后再执行类的init方法,对这个对象进行初始化,所以我们可以基于这个,实现单例模式
class Singleton(object):
__instance = None # 设置一个类属性(只创建一个对象)
is_first_run = True # 设置一个类属性(只初始化一次)
def __new__(cls, age):
if not cls.__instance: # 这里对象还没创建所以是cls调用
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, age):
if self.is_first_run:
self.age = age
self.is_first_run = False # 这里new创建了对象,所以用self
a = Singleton(18)
b = Singleton(20)
print(id(a))
print(id(b))
print(b.age)
print(a.age)
打印结果如下:
140063755106960
140063755106960
18
18