python编写自定义类实现单例模式

简介

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。确保一个类只有一个实例存在,也就是说在整个系统中,如果你希望某个类只能出现一个实例,那么单例模式就派上用场了。

单例模式的优缺点

优点:

  • 在内存中只有一个对象,减少内存开支;
  • 可以避免频繁的创建销毁对象,可以提高性能;
  • 可以避免对资源的多重占用;
  • 为整个系统提供一个全局访问点。

缺点:

  • 单例模式没有抽象层,扩展很困难;
  • 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
  • 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;

在上代码之前,我们需要明确两个魔法方法的区别
__new__和__init__的区别
根据官方文档:
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
博主实现单例模式的思路是,在__new__中判断当前是否已经存在示例,如果存在,则直接返回存在的实例。
下面我们看看代码:

单例模式的实现

class Single_Class():
	#用于存放实例
    __instance = None
    #判断是否是第一次初始化
    __first_init = False
    def __new__(cls, name, age):
        # 如果类属性__instance的值为None,那么就创建一个对象
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        # 如果已经有实例存在,直接返回
        return cls.__instance
    # 只执行一次init方法
    def __init__(self, name, age):
        if not self.__first_init:
            self.name = name
            self.age = age
            self.__first_init = True

下面我们进行测试:

firstmam = Single_Class("Jack",19)
secondman = Single_Class('Bob',21)
print(id(firstmam),"name:",firstmam.name,"age:",firstmam.age)
print(id(secondman),"name:",secondman.name,"age:",secondman.age)
"""打印结果为:
3146062917080 name: Jack age: 19
3146062917080 name: Jack age: 19
"""

以上就是博主今天给大家分享的内容了,希望大家能够有所收获,祝大家学习进步。

猜你喜欢

转载自blog.csdn.net/weixin_42494845/article/details/105115933