Python中的__new__()方法和__init__()方法的执行顺序是怎样的
在Python中,一个类的实例化过程通常包含两个步骤:__new__()方法和__init__()方法。它们的执行顺序是先执行__new__()方法创建实例,然后再执行__init__()方法初始化实例。
__new__()方法是一个静态方法,它在实例创建之前被调用。这个方法的主要作用是创建并返回一个新的实例对象。在调用__new__()方法时,需要传入一个参数cls,代表将要创建的类。__new__()方法的返回值通常是一个新的实例对象,但它也可以返回一个已存在的实例对象,甚至可以返回一个不同的类的实例。
下面是一个示例,展示了__new__()方法的执行顺序:
class MyClass:
def __new__(cls, *args, **kwargs):
print("执行__new__()方法")
instance = super().__new__(cls)
return instance
def __init__(self, *args, **kwargs):
print("执行__init__()方法")
return
obj = MyClass()
运行上述代码,输出如下:
执行__new__()方法 执行__init__()方法
从输出结果可以看出,首先执行了__new__()方法,然后执行了__init__()方法。在__new__()方法中,我们使用了super().__new__(cls)来调用父类的__new__()方法,以确保得到一个正确的实例对象。
接下来是__init__()方法的执行顺序。__init__()方法是一个实例方法,它在实例创建以后被调用。它的主要作用是对实例进行初始化:为实例的属性赋予初始值,执行一些必要的操作等。
下面是一个示例,展示了__init__()方法的执行顺序:
class MyClass:
def __new__(cls, *args, **kwargs):
instance = super().__new__(cls)
return instance
def __init__(self, *args, **kwargs):
print("执行__init__()方法")
return
obj = MyClass()
运行上述代码,输出如下:
执行__init__()方法
从输出结果可以看出,只有__init__()方法被执行了一次。注意,上面的__new__()方法仅仅返回了一个新的实例对象,并没有对实例进行初始化操作。
需要注意的是,__new__()方法返回的实例对象可以是任意类型的对象,包括其他类的实例。下面是一个示例,展示了__new__()方法返回一个不同的类的实例对象:
class ClassA:
def __new__(cls, *args, **kwargs):
instance = super().__new__(cls)
return instance
class ClassB:
def __init__(self, *args, **kwargs):
print("执行__init__()方法")
return
obj = ClassA()
obj.__class__ = ClassB # 将obj的类修改为ClassB
obj.__init__() # 执行ClassB的__init__()方法
运行上述代码,输出如下:
执行__init__()方法
从输出结果可以看出,__new__()方法返回了一个ClassA的实例对象,但是将其类修改为了ClassB。因此,在调用__init__()方法时,实际执行的是ClassB的__init__()方法。
总结起来,__new__()方法和__init__()方法的执行顺序是__new__()先于__init__()。__new__()方法在实例创建之前被调用,用于创建实例对象;__init__()方法在实例创建之后被调用,用于初始化实例。
