Python 的 __init__ 和 __new__ 的区别
概述
在 Python 中,__new__
和 __init__
是两个特殊方法,用于创建和初始化对象。虽然这两个方法都涉及到对象的创建,但它们在行为、时机和用途上存在着一些关键区别。理解这些区别对于深入了解 Python 类的内部工作原理至关重要。
new
__new__
是第一个被调用的特殊方法,它负责创建新对象。它接受类本身作为第一个参数,后面可以跟随任意数量的参数。__new__
方法可以返回新创建的对象或引发异常。如果 __new__
成功创建对象,它将返回该对象。否则,它将引发异常,例如 TypeError
或 MemoryError
,这将阻止对象的创建。
要点:
__new__
是一个类方法,返回新创建的对象或引发异常。- 它用于创建新对象,在
__init__
之前调用。 - 如果
__new__
失败,__init__
不会被调用。
init
__init__
是第二个被调用的特殊方法,它负责初始化新创建的对象。它接收新创建的对象作为第一个参数,后面可以跟随任意数量的参数。__init__
方法不应返回任何值。它的主要目的是初始化对象的状态,例如设置属性值。__init__
可以在对象的整个生命周期中被多次调用。
要点:
__init__
是一个实例方法,对新创建的对象进行初始化。- 它用于设置对象的状态,在
__new__
之后调用。 __init__
可以随时在对象上被调用,而不仅仅是在创建时。
区别
以下是一些 __new__
和 __init__
之间的主要区别:
- 时机:
__new__
在__init__
之前被调用。 - 返回值:
__new__
返回新创建的对象,而__init__
不返回任何值。 - 作用:
__new__
负责创建对象,而__init__
负责初始化对象。 - 调用频率:
__new__
通常只在创建对象时调用一次,而__init__
可以随时在对象上被调用。
何时重写 new 和 init
在某些情况下,你可能需要重写 __new__
和 __init__
方法,例如:
- 重写 _new_:
- 控制对象创建过程。
- 限制对象的创建。
- 返回代理类或工厂模式创建的对象。
- 重写 _init_:
- 初始化对象的状态。
- 验证对象的输入。
- 执行复杂的初始化逻辑。
问答
1. __new__
和 __init__
的调用顺序是什么?
答:__new__
在 __init__
之前被调用。
2. __new__
应该返回什么?
答:__new__
应该返回新创建的对象。
3. __init__
主要用于做什么?
答:__init__
主要用于初始化对象的状态。
4. 我需要什么时候重写 __new__
方法?
答:你需要重写 __new__
方法,当你需要控制对象创建过程或返回代理类或工厂模式创建的对象时。
5. 我需要什么时候重写 __init__
方法?
原创文章,作者:杨文宁,如若转载,请注明出处:https://www.wanglitou.cn/article_101764.html