Python中__new__和__init__的简单介绍

__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。

两者关系的总结

经过上述的简要分析,当实例化一个类时,整个流程是这样的:

  1. 调用该类的__new__方法,其实该类中也是调用的object或父类的__new__方法,需传入需要实例化的类,并返回一个该类的实例化对象。
  2. 调用__init__方法,对该对象进行初始化,其中self便是__new__方法中返回的实例化对象。

猜你喜欢

转载自blog.csdn.net/dxk_093812/article/details/84176697