单例模式的主要目的是确保某一个类只有一个实例存在,节约内存资源。
class Earth:
pass
a = Earth()
print(id(a)) # 260728291456
b = Earth()
print(id(b)) # 260728291624
class Earth:
__instance = None # 定义一个类属性做判断
def __new__(cls):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
a = Earth()
print(id(a)) # 512320401648
b = Earth()
print(id(b)) # 512320401648
每次实例化一个对象时,都会先调用 _new_() 函数创建一个对象,再调用 _init_() 函数初始化数据。因而,在 new函数中判断 Earth类 是否已经实例化过,如果不是,调用父类的 new 函数创建实例;否则返回之前创建的实例。
_instance 作为类属性,保证了所有对象的 _instance 都是同一个。