python实现单例模式

单例模式

​ 单例模式:确保一个类只有一个实例存在
比如我们进行配置文件读取是通过APPconfig类进行读取,在程序运行期间如果很多地方都需要使用配置文件的内容,这时候我们Appconfig的实例如果多次创建则会严重消费内存的资源,尤其配置文件特别多的情况下更是如此,所以我们要希望在程序运行期间就只创建一次Appconfig的实例即可

单例模式的实现原理

​ 所有类都是继承了我们的object类,在__init__方法执行前都是先执行我们的__new__方法进行分配内存地址,然后返回对象引用传递给init方法,所以我们为了实现单例模式必须要重写init方法

单例模式的实现方法详解

#编写普通类进行测试返回地址

class Player:
    def __init__(self):
            print("init 执行了")
#实例化
a = Player()
#实例化
b=Player()
#返回对象引用的内存地址,直接使用print实例即可
print ("a=",a)
print ("b=",b)
---------------------------------------------------------------------------------
C:\Users\sky\PycharmProjects\pythonProject\venv\Scripts\python.exe D:/new/testtttttpython.py
init 执行了
init 执行了
a= <__main__.Player object at 0x000001BAA42AA400>
b= <__main__.Player object at 0x000001BAA42E7FD0>

​ 总结:普通的类,用于测试类实例的内存地址,从上述例子可以看出我们的类每次进行实例化打印出的内存地址不同,所以我们要在初始化实例前进行对对象引用的地址确保唯一性,就要使用我们的new方法

#加入new方法保证init前对象的内存地址的唯一性

class Player:
    def __new__(cls, *args, **kwargs):
        print ("new执行了")
    def __init__(self):
            print("init 执行了")
#实例化
a = Player()
#实例化
b=Player()
#返回对象引用的内存地址,直接使用print实例即可
print ("a=",a)
print ("b=",b)
-------------------------------------------------
C:\Users\sky\PycharmProjects\pythonProject\venv\Scripts\python.exe D:/new/testtttttpython.py
new执行了
new执行了
a= None
b= None

​ 总结:从上述结果可以看出加入new方法后new方法确实在init方法前执行,但是我们的类实例并未进行打印实际的内存地址,所以我们要对object类中的new方法进行重写赋值操作

class Player:
    __instance = None
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance =object.__new__(cls)
        return cls.__instance
    def __init__(self):
            print("init 执行了")
#实例化
a = Player()
#实例化
b=Player()
#返回对象引用的内存地址,直接使用print实例即可
print ("a=",a)
print ("b=",b)
------------------------------------------
C:\Users\sky\PycharmProjects\pythonProject\venv\Scripts\python.exe D:/new/testtttttpython.py
init 执行了
init 执行了
a= <__main__.Player object at 0x0000023FF5E784C0>
b= <__main__.Player object at 0x0000023FF5E784C0>

​ 总结:使用new方法对类的私有属性进行赋值,在每次实例化前判断类实例是否为None从而判断是否进行分配内存空间,但是可以看到每次进行实例化我们的init方法还是会进行执行,所以要进行判断是否我们是否要进行init,所以还要引入一个类变量进行判断

class Player:
    __instance = None
    __flag =None
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance =object.__new__(cls)
        return cls.__instance
    def __init__(self):
        if Player.__flag is None:
            Player.__flag =True
            print("init 执行了")
#实例化
a = Player()
#实例化
b=Player()
#返回对象引用的内存地址,直接使用print实例即可
print ("a=",a)
print ("b=",b)
--------------------------------------------
C:\Users\sky\PycharmProjects\pythonProject\venv\Scripts\python.exe D:/new/testtttttpython.py
init 执行了
a= <__main__.Player object at 0x0000019E6D8374C0>
b= <__main__.Player object at 0x0000019E6D8374C0>

​ 总结:至此实现了单例模式的编写,一个类只会进行一次实例化,分配一次内存空间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值