在模式的学习中发现了之前没有留意过的点
init 和 new 方法
通常我们在类中使用__init__方法来初始化对象,
new()方法用于创建实例,类实例化之前会首先调用,它是class的方法,是个静态方法。而__init__()方法用户初始化实例,该方法用在实例对象创建后被调用,它是实例对象的方法,用于设置类实例对象的一些初始值。
如果类中同时出现了__init__()方法和__new__()方法,则先调用new()方法后调用__init__()方法。new()方法是创建实例的第一步,执行完了需要返回创建的类的实例,否则则报错,无法执行__init__()方法。其中,init()方法将不返回任何信息。
在调用顺序上 new 先于 init 调用,
单例模式的实现
class Mycls:
_instance = None
def __new__(cls):
# 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间
if cls._instance == None:
# 把类属性中保存的对象引用返回给python的解释器
cls._instance = object.__new__(cls)
return cls._instance
# 如果cls._instance不为None,直接返回已经实例化了的实例对象
else:
return cls._instance
def __init__(self):
print('init')
my1=Mycls()
print(my1)
my2=Mycls()