单例模式
在确定“类中的属性与方法”不变时,需要反复调用该类
产生不同的对象,会产生不同的内存地址,造成资源浪费
让所有类在实例化时,指向同一个内存地址,称之为单例模式
(无论产生多少个对象,都会指向单个 实例)
优点:节省空间
__new__方法实现单例
要知道,虽然__new__方法接受的参数和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法,所以,当我们创建一个类的时候,编译器会先执行__new__方法,再执行__init__方法。
```python class Test:
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'): #hasattr(a,b)方法是判断a里边有没有b,在这里就是判断cls(本类)里边是否存在名为'_instance'的变量
cls._instance = super().__new__(cls)
return cls._instance
第一个参数cls是当前正在实例化的类。
如果要得到当前类的实例,应当在当前类中的__new__()方法语句中调用当前类的父类 的__new__()方法。
a = Test()
print(id(a))
b = Test()
print(id(b))
<br>
> 2400710875016
> 2400710875016
> 原理:
>
> 每次调用\__new__方法,都会判断一次本类有没有实例化对象产生过,没有的话,就创建一个,如果有的话,就返回以前创建过的那个对象,并将新的参数赋给原来的实例,对其进行更新。