单例模式:
应用该模式的一个类只有一个实例,即一个类只有一个对象实例。
class A(object):
def __new__(cls):
print("执行了new方法")
return super().__new__(cls)
def __init__(self):
print("执行了init方法")
if __name__ == '__main__':
a = A() # 执行了new方法 # 执行了init方法
print(a) # <__main__.A object at 0x00000285FFF628D0>
new 方法先于 init 方法执行,new方法传入的是一个类(cls),而 init 传入的是一个实例对象(self)
__new__方法返回的值就是一个实例化对象
如果__new__方法返回None,
则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法)
new实现单例模式
# 通过 new 方式实现单一实例
# hasattr() 函数用于判断对象是否包含对应的属性。
# 格式:hasattr(object, name)
class A(object):
def __new__(cls):
print("开始执行new方法")
if not hasattr(cls, "_ins"):
cls._ins = super().__new__(cls)
return cls._ins
def __init__(self):
print("开始执行init方法")
if __name__ == '__main__':
a = A()
a1 = A()
if id(a) == id(a1):
print(f"实例对象相同,id:{id(a)} - > id:{id(a1)}")