欢迎访问宙启技术站
智能推送

Python中的__new__()方法和__init__()方法的执行顺序是怎样的

发布时间:2023-12-29 04:13:21

在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__()方法在实例创建之后被调用,用于初始化实例。