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

Python中的new()方法与对象初始化的区别

发布时间:2023-12-23 07:35:25

在Python中,有两种方法可以用来初始化和创建对象:__new__()方法和__init__()方法。这两个方法在对象的生命周期中扮演着不同的角色。

1. __new__()方法:

- __new__()方法是在对象实例化之前被调用的特殊方法。它负责创建并返回一个新的实例对象。

- __new__()方法是一个通过类调用的静态方法,它的第一个参数是类本身(通常被称为cls)。

- __new__()方法的返回值是一个新创建的对象实例(通常是super().__new__(cls))。

- 示例代码:

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__() called")
        instance = super().__new__(cls)   # 创建新的实例对象
        return instance

    def __init__(self, *args, **kwargs):
        print("__init__() called")
        self.name = args[0]   # 初始化对象属性

obj = MyClass("John")

输出:

__new__() called
__init__() called

在上面的例子中,__new__()方法被调用并创建了一个新的实例对象,然后将该实例对象传递给__init__()方法进行初始化。

2. __init__()方法:

- __init__()方法是在对象实例化之后被调用的特殊方法。它负责初始化对象的属性。

- __init__()方法的第一个参数是实例对象(通常被称为self),后面的参数是传递给构造函数的参数(如果有的话)。

- __init__()方法没有返回值,它只负责在对象实例化之后进行初始化操作。

- 示例代码:

class MyClass:
    def __new__(cls, *args, **kwargs):
        instance = super().__new__(cls)
        return instance

    def __init__(self, *args, **kwargs):
        print("__init__() called")
        self.name = args[0]   # 初始化对象属性

obj = MyClass("John")
print(obj.name)

输出:

__init__() called
John

在上面的例子中,__new__()方法创建了一个新的实例对象,然后将该实例对象传递给__init__()方法进行初始化。在__init__()方法中,我们将args[0]赋值给了对象的name属性。

可以看出,__new__()方法用于创建对象的实例,而__init__()方法用于初始化对象的属性。在一般的情况下,我们只需要重写__init__()方法即可,因为大部分的初始化工作可以在__init__()方法中完成。

同时,需要注意的是,__new__()方法的返回值是一个新创建的实例对象,而__init__()方法没有返回值。如果在__new__()方法中没有返回一个实例对象,那么__init__()方法将不会被调用,也就无法对对象进行初始化操作。