1、__new__
方法默认返回实例对象供__init__
方法、实例方法使用。
2、__init__
方法为初始化方法,为类的实例提供一些属性或完成一些动作。
3、__new__
方法创建实例对象供__init__
方法使用,__init__
方法定制实例对象。
__new__
方法必须返回值,__init__
方法不需要返回值。(如果返回非None值就报错)
4、对象的创建和初始化过程示意图
5、执行流程:
a、创建Person类的对象student=Person(‘kb’,19),先执行等号右边的内容Person(‘kb’,19)
b、调用Person类中的__new__
方法,并将Person类传给方法中的cls
c、创建obj对象
d、执行__init__
方法,并将obj对象赋值给self
e、将self再传给student1对象
6、我们比较两个方法的参数,可以发现__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self),而有意思的是,__new__方法返回的值就是一个实例化对象(ps:如果__new__方法返回None,则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法)。
我们可以这么理解它们之间的关系,__new__是开辟疆域的大将军,而__init__是在这片疆域上辛勤劳作的小老百姓,只有__new__执行完后,开辟好疆域后,__init__才能工作,结合到代码,也就是__new__的返回值正是__init__中self。