了解单例模式之前,可以先了解下Python的构造方法:
2-1:__new__方法与__init__方法
构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
他们都是在创建类的实例时会被默认调用的方法,而且创建实例时传入的参数也都会传到这两个方法里。但他们也有很重要的区别,比如对 __new__() 的调用比 __init__() 要早,__new__() 有返回值,__init__() 没有
2-2:
单例模式可以做什么:
1)你在这边创建个对象给它设置某个属性,在另外一个地方再创建一个对象再给它设置某个属性,那么,它们之间的属性是通用的。
2)还可以做到就是,这个类只创建一个对象 可以节约内存。
通过这个对象设置一些全局都可以用的东西,只要在这个对象设置里面设置完毕之后,在别的地方再创建一个对象,创建完后直接访问之前其它地方设置好的属性,非常方便。
2-3:
代码实现:
class Mytest:
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
# 调用父类方法为第一个对象分配空间
# 或者 cls.instance=object.__new__(cls)
# object类为父类,重写new方法需要继承自父类方法,需要返回父类调用new方法的结果
cls.instance = super().__new__(cls)
return cls.instance
a=Mytest()
print(a.instance)
b=Mytest()
print(b.instance)
print(id(a))
print(id(b))
|