8. __new__方法
什么是__new__方法
__new__
方法是一个负责创建对象的类方法(通常由解释器自动调用),而 __init__
则负责初始化对象。
作用:
控制对象的创建过程。
说明
此方法必须返回一个对象(实例)(通常是当前类的对象,也可以是其他类的对象)。
如果
__new__
方法未正确返回实例,则__init__
不会被调用。
对象产生的顺序:
__new__
方法构造函数调用时最先被调用,它创建并返回一个对象。- 然后调用
__init__
对象方法对该对象进行初始化。
对象的创建
当调用构造函数:类名() 时,Python为创建对象做两件事:
- 创建对象:调用
__new__(cls)
类方法来创建对象并返回此对象。 - 初始化对象:调用
__init__(self)
方法类初始化对象self。
示例
# __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__
方法的区别
__new__
方法是创建对象,__init__
是在创建完后初始化对象。__new__
是类方法,传入的是类cls,__init__
是对象(实例)方法,传入的是对象self, 是__new__
调用后返回来的对象。__new__
方法必须返回对象,而__init__
必须返回 None。