new和__init__的区别

16
0
0
2022-11-11

new和__init__的区别

在Python中,__new____init__ 是类创建对象时涉及的两个魔术方法,它们在对象创建过程中扮演不同的角色。

以下是它们的主要区别:

  1. 调用时机

    • __new__ 是在实例化一个对象之前被调用的,它是用来创建并返回该类的新实例的方法。

    • __init__ 是在实例对象创建之后被调用的,用于初始化对象。

  2. 功能

    • __new__ 是一个静态方法,它的第一个参数是类本身,其任务是返回一个该类的实例。这个方法通常用于控制对象的创建过程,例如实现单例模式。

    • __init__ 是一个实例方法,它的第一个参数是self(即类的实例),用于初始化创建好的对象,设置对象属性等。

  3. 返回值

    • __new__ 必须返回一个创建好的实例,这个实例将传递给 __init__ 方法。

    • __init__ 不需要返回值,它的作用是修改传递给它的实例(self)。

  4. 继承

    • 当子类继承父类时,如果需要改变实例的创建过程,可以覆盖 __new__ 方法。

    • 如果子类需要执行一些额外的初始化步骤,可以覆盖 __init__ 方法。

  5. 在不可变类型中的使用

    • 对于不可变类型(如Python中的str, int, tuple等),__new__ 方法在对象创建过程中非常重要,因为一旦对象创建完成,其值就不能改变了。

以下是一个简单的例子来说明 __new____init__ 的使用:

python

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("调用 __new__ 方法")
        instance = super(MyClass, cls).__new__(cls)
        return instance

    def __init__(self, value):
        print("调用 __init__ 方法")
        self.value = value

obj = MyClass(10)

输出将会是:

调用 __new__ 方法
调用 __init__ 方法

在这个例子中,__new__ 负责创建对象,而 __init__ 负责初始化对象。

在Python中,`__new__` 和 __init__ 是在创建对象时调用的两个特殊方法。`__new__` 是一个静态方法,它在对象实例化之前被调用,负责创建并返回类的新实例。

__init__ 是一个实例方法,它在对象被创建之后被调用,用于初始化对象。 当我们创建一个对象时,Python 首先调用 __new__ 来创建对象,然后调用 __init__ 来进行初始化。`__new__` 的主要作用是创建对象,而 __init__ 的作用是设置对象的属性和执行初始化步骤。 例如,如果我们有一个类 MyClass,它重写了 __new____init__ 方法,当我们创建 MyClass 的一个实例时,首先会打印出“调用 __new__ 方法”,然后是“调用 __init__ 方法”。 总结来说,`__new__` 是对象的创建者,而 __init__ 是对象的初始化者。在大多数情况下,我们只需要重写 __init__ 方法来初始化对象,只有在需要控制对象的创建过程时,我们才会重写 __new__ 方法。