8. __new__方法

什么是__new__方法

__new__ 方法是一个负责创建对象的类方法(通常由解释器自动调用),而 __init__ 则负责初始化对象。

作用:

控制对象的创建过程。

说明

此方法必须返回一个对象(实例)(通常是当前类的对象,也可以是其他类的对象)。

如果 __new__ 方法未正确返回实例,则 __init__ 不会被调用。

对象产生的顺序:

  1. __new__ 方法构造函数调用时最先被调用,它创建并返回一个对象。
  2. 然后调用 __init__ 对象方法对该对象进行初始化。

对象的创建

当调用构造函数:类名() 时,Python为创建对象做两件事:

  1. 创建对象:调用 __new__(cls) 类方法来创建对象并返回此对象。
  2. 初始化对象:调用 __init__(self) 方法类初始化对象self。

python对象创建的顺序图

示例

# __new__ 方法 示例

class Pet:
    '''宠物类'''
    def __new__(cls, *args, **kwargs):
        print('__new__方法被调用, args:', args, 'kwargs:', kwargs)
        return super().__new__(cls)

    def __init__(self):
        print('__init__方法被调用')

ani = Pet()
print(ani)

运行结果

__new__方法被调用, args: () kwargs: {}
__init__方法被调用
<__main__.Pet object at 0x10f4e6e40>

从运行结果中,我们可以看出__new__方法会最先调用,然后调用 __init__ 方法。

上述程序中 __new__ 方法是调用 父类的 __new__ 方法来创建对象,并将父类创建的对象返回。

再看下面的例子:

# __new__ 方法 示例

class Dog:
    def speak(self):
        print('旺')

class Cat:
    def speak(self):
        print('喵')

class Pet:
    '''宠物类'''
    def __new__(cls, *args, **kwargs):
        print('__new__方法被调用, args:', args, 'kwargs:', kwargs)
        return Dog()

    def __init__(self):
        print('__init__方法被调用')

ani = Pet()
print(ani)
ani.speak()

运行结果

__new__方法被调用, args: () kwargs: {}
__init__方法被调用
<__main__.Pet object at 0x10f4e6800>
旺

我们在 __new__ 方法中返回一个 Dog类型的对象。那么创建的 Pet 类型的对象就被替换成了 Dog 类型的对象了。

__new____init__ 方法的区别

  1. __new__ 方法是创建对象,__init__ 是在创建完后初始化对象。
  2. __new__ 是类方法,传入的是类cls,__init__ 是对象(实例)方法,传入的是对象self, 是 __new__ 调用后返回来的对象。
  3. __new__ 方法必须返回对象,而 __init__ 必须返回 None。