Python 中 __init__
和 __new__
区别是什么?
在 Python 面向对象编程中,__init__
和 __new__
是两个特殊方法,用于在创建实例对象时执行特定任务。虽然这两个方法都与对象创建相关,但它们的用途和工作原理却有很大不同。
__new__
__new__
是一个类方法,在创建新对象时被调用。它的作用是分配内存并返回一个新对象的引用。简单来说,__new__
负责创建对象本身,而不负责初始化它的属性。
__new__
方法的语法如下:
python
def __new__(cls, *args, **kwargs):
# 分配内存并返回新对象的引用
在 __new__
方法中,可以使用 object.__new__(cls)
来调用父类的 __new__
方法,并获得父类的内存分配。
__init__
__init__
是一个实例方法,在对象创建后紧跟 __new__
方法被调用。它的作用是初始化对象的属性,使其具有适当的值。
__init__
方法的语法如下:
python
def __init__(self, *args, **kwargs):
# 初始化对象属性
在 __init__
方法中,可以使用 super().__init__(*args, **kwargs)
来调用父类的 __init__
方法,并进行进一步的初始化。
__new__
和 __init__
的区别
以下表格总结了 __new__
和 __init__
之间的关键区别:
| 特征 | __new__
| __init__
|
|—|—|—|
| 类型 | 类方法 | 实例方法 |
| 调用时机 | 在对象创建时 | 在 __new__
方法之后 |
| 职责 | 创建对象 | 初始化对象属性 |
| 返回值 | 新对象的引用 | 无 |
使用示例
以下是一个演示 __new__
和 __init__
用法的示例:
“`python
class Person:
def new(cls, name):
print(“调用 new 方法”)
return super().new(cls)
def __init__(self, name):
print("调用 __init__ 方法")
self.name = name
person = Person(“John”)
“`
运行此代码,将输出以下结果:
调用 __new__ 方法
调用 __init__ 方法
在这个示例中,__new__
方法负责创建 Person
对象,而 __init__
方法负责初始化 name
属性。
常见问答
1. __new__
和 __init__
方法总是成对出现的吗?
答:是的,在创建对象时,__new__
和 __init__
方法总是成对出现的。__new__
方法返回新对象的引用,然后调用 __init__
方法对其进行初始化。
2. 可以继承 __new__
方法吗?
答:可以。__new__
方法可以像其他类方法一样被继承。当子类继承父类的 __new__
方法时,它可以重写父类的 __new__
方法,并提供自己的内存分配逻辑。
3. 可以在 __new__
方法中抛出异常吗?
答:可以。__new__
方法可以抛出异常,以指示内存分配失败或其他错误。如果 __new__
方法抛出异常,则不会调用 __init__
方法。
4. 可以在 __init__
方法之外初始化对象属性吗?
答:不。__init__
方法是初始化对象属性的唯一正确方法。在 __init__
方法之外初始化对象属性会导致不可预知的行为。
5. 可以直接调用 __new__
方法吗?
答:不可以。__new__
方法只能在创建对象时隐式调用。不能直接从外部代码调用 __new__
方法。
原创文章,作者:王利头,如若转载,请注明出处:https://www.wanglitou.cn/article_8821.html