什么是单例模式
简单来说,单例模式就是在一个类当中只能存在一个对象。
你当然可以在代码中多次创建单例类的对象,但是无论你创建多少个对象,这个对象都是同一个,即它们的地址值是一样的。
先看一下非单例类
class A:
pass
if __name__ == '__main__':
a1 = A()
a2 = A()
print(id(a1), id(a2))
看一下运行结果
很明显,地址值是不一样的,因为这个类并不是单例类。
单例类
class B:
# 借助一个类变量实现单例
_instance = None
def __new__(cls, *args, **kwargs):
if B._instance == None:
B._instance = super().__new__(cls)
# 一个类之所以可以有多个不同的对象,是因为在__new__方法中的返回值不一样
# 只有返回了super().__new__(cls),才能给对象分配地址值,对象才能被创建
# 因为这里返回值永远一致,所以地址值永远都一样,即只会存在一个对象
return B._instance
b1, b2, b3 = B(), B(), B()
print(id(b1), id(b2), id(b3))
看一下运行结果
单例的简单实用场景
就拿打印机来举例
小黄,小白,小蓝都需要用打印机打印东西
打印机是同一台,那么可以定义一个单例打印机类
小黄,小白,小蓝都要使用打印机
他们是同一个类,是该类中不同的对象
代码
# 人物类
class Person:
# 使用打印机,并提供要打印的内容
# info::打印的内容;printer:打印机类的对象
def use_print(self, info, printer):
# 打印机添加将要打印的内容
printer.add_info(info)
# 打印机类
class Printer:
# 辅助__new__
__instance = None
# 辅助__init__
__is_init = False
# 实现单例
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super().__new__(Printer)
return cls.__instance
def __init__(self):
if Printer.__is_init == False:
# 定义一个空列表,保存将要打印的内容
self.l = []
Printer.__is_init = True
# 添加打印内容到列表中
def add_info(self, info):
self.l.append(info)
# 打印内容
def start_print(self):
print(self.l)
if __name__ == '__main__':
p1, p2, p3 = Person(), Person(), Person()
printer1, printer2 = Printer(), Printer()
p1.use_print("hello world", printer1)
p2.use_print("hello python", printer2)
p3.use_print("hello MarkAdc", printer1)
print(id(printer1), id(printer2))
printer1.start_print()
printer2.start_print()
运行结果
谢谢观看