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

Python中的__new__()和__init__()方法的区别和联系

发布时间:2024-01-19 05:28:11

__new__()和__init__()都是Python类的特殊方法,用于创建对象时的初始化操作。

__new__()方法是在对象创建之前被调用的,负责创建并返回实例对象。它是一个静态方法, 个参数是类本身,之后的参数与__init__()方法一致。__new__()方法返回一个实例对象,如果返回的是当前类的实例对象,则会自动调用__init__()方法进行初始化。如果返回的是其他类的实例对象,则不会调用当前类的__init__()方法。

__init__()方法是在对象创建之后被调用的,负责初始化对象的属性。它是一个实例方法, 个参数是self,之后的参数是根据需要传递的。__init__()方法不需要返回任何值,它会在对象创建完成后自动返回。

下面是一个使用__new__()和__init__()方法的例子:

class Person:
    def __new__(cls, name):
        print("__new__() is called.")
        return super().__new__(cls)
    
    def __init__(self, name):
        print("__init__() is called.")
        self.name = name

person = Person("Alice")

在这个例子中,首先调用__new__()方法创建了一个Person类的实例对象。__new__()方法中打印了一条消息,并使用super().__new__(cls)创建了一个实例对象。然后,返回的实例对象会自动传递给__init__()方法进行初始化。__init__()方法中打印了一条消息,并将参数name赋值给实例对象的name属性。

运行以上代码会输出以下结果:

__new__() is called.
__init__() is called.

通过以上输出结果可以看到,首先__new__()方法被调用,然后才是__init__()方法被调用。也就是说,__new__()方法是在__init__()方法之前被调用的。

另外,需要注意的是,__new__()方法返回的实例对象不一定是当前类的实例对象。如果返回的是其他类的实例对象,那么当前类的__init__()方法就不会被调用。例如,如果将以上代码中的super().__new__(cls)替换为Person类的另一个子类Student的实例对象,那么Person类的__init__()方法将不会被调用。

总结起来,__new__()方法负责创建并返回实例对象,而__init__()方法负责初始化对象的属性。它们是在对象创建的不同阶段调用的,__new__()方法在对象创建之前调用,而__init__()方法在对象创建之后调用。