__init__方法
相信大家对__init__方法是很熟悉了,它是在实例化类的时候被调用,用于初始化该对象。
class Student:
def __init__(self,name,number):
self.name=name
self.number=number
def __str__(self):
return 'Student:%s(%s)'%(self.name,self.number)
stu=Student('Michael',24)
print(stu)
运行结果为:
Student:Michael(24)
可以看到当创建一个对象时,会调用类的__init__方法对其进行处理。
__new__
那么__new__方法又是干什么的呢?其实当我们实例化一个对象时,我们首先调用的方法就是__new__,而不是__init__。
class Student(object):
def __new__(cls,name,age):
print("__new__")
print(cls)
return object.__new__(cls)
#return super().__new__(cls)
def __init__(self,name,number):
print("__init__")
self.name=name
self.number=number
def __str__(self):
return 'Student:%s(%s)'%(self.name,self.number)
stu=Student('Michael',24)
print(stu)
运行结果为:
__new__
<class '__main__.Student'>
__init__
Student:Michael(24)
可以看到__new__方法在__init__之前被调用,其中cls代表要实例化的类,__new__方法会返回一个cls类的实例化对象,这就是__init__方法中的self。
两者关系的总结
经过上述的简要分析,当实例化一个类时,整个流程是这样的:
- 调用该类的__new__方法,其实该类中也是调用的object或父类的__new__方法,需传入需要实例化的类,并返回一个该类的实例化对象。
- 调用__init__方法,对该对象进行初始化,其中self便是__new__方法中返回的实例化对象。