python单例设计模式

设计模式

设计模式是前人的总结和经验的提炼,通常被人们广为流传的设计模式都是针对某一特定问题的成熟解决方案

单例设计模式

单例:让类创建的对象,在系统中有唯一的实例

我们在创建对象的时候;
1.为对象分配空间: new
创建对象的时候,python解释器首先会调用 __new__方法为对象分配空间
__new__方法是一个由object基类提供的内置的静态方法,主要有两个作用,
在内存中为对象分配空间,返回对象的引用

2.对象初始化: init
python解释器获得对象的引用后,将引用的第一个参数传递给__init__方法
为对象分配空间
重写__new__方法

重写__new__方法的代码非常固定
    继承自父类方法
    返回父类方法调用__new__方法的结果
重写__new__方法一定要return object.__new__(cls)
否则python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法

在这里插入图片描述

可以看到以上方法创建的对象的内存地址不同,为了节省内存空间可以修改一下__new__方法,使创建的两个对象的内存地址空间相同
在这里插入图片描述

python中的单例
单例:让类创建的对象,在系统中只有唯一的一个实例
1.定义一个类属性,初始值是None,用于记录单例对象的引用(因为当一个类
定义完成运行程序的时候,内存中有这个类创建的对象吗?
并没有,我们需要调用创建对象的方法,内存中才会有第一个对象)
2.重写__new__方法
3.如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
4.返回类属性中记录的对象的引用

只执行一次__init__方法
只执行一次初始化方法
在每次使用 类名() 创建对象时,python的解释器会自动调用两个方法
new 分配空间
init 对象初始化
但在上一小节中 __new__方法改造之后,每次都会得到第一被创建对象的引用
但是初始化方法还是会被再次用掉

需求:让初始化方法只执行一次
解决办法:
1.定义一个类属性init_flag标记是否执行过初始化动作,初始值为False
2.在__init__方法中,判断init_flag,如果为False就执行初始化动作
3.然后将init_flag设置为True
4.这样,再次自动调用__init__方法时,初始化动作就不会再次被执行了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq657886445/article/details/82777921