Python中的单例模式



什么是单例模式

简单来说,单例模式就是在一个类当中只能存在一个对象。
你当然可以在代码中多次创建单例类的对象,但是无论你创建多少个对象,这个对象都是同一个,即它们的地址值是一样的。



先看一下非单例类

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()


运行结果

在这里插入图片描述
谢谢观看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值