Python new 和 init 区别
在 Python 中,new
和 init
都是特殊方法,主要用于在创建对象时执行初始化操作。下面是这两个方法的主要区别:
1. 方法签名
new
方法的签名为:
python
def __new__(cls, *args, **kwargs):
其中,cls
参数表示正在创建的类的引用。
init
方法的签名为:
python
def __init__(self, *args, **kwargs):
其中,self
参数表示正在创建的对象的引用。
2. 调用时机
new
方法在创建对象之前被调用,它负责分配内存并创建新对象。如果 new
方法返回一个对象,则会调用 init
方法。
init
方法在创建对象之后被调用,它负责对象实例的初始化,设置属性值和执行其他必要的初始化操作。
3. 常用场景
new
方法通常用于以下场景:
- 实现自定义类元类(Metaclass)
- 控制对象创建过程,例如实现单例模式
拦截对象创建,例如实现代理模式
init
方法通常用于以下场景:初始化对象属性
- 执行其他必要的初始化操作
调用父类的
init
方法4. 详细说明
new
方法new
方法由类调用,而不是由对象调用。- 它在对象创建之前被调用,并且必须返回一个对象。
- 如果
new
方法返回None
,则不会创建对象。 - 如果
new
方法返回一个对象,则会调用init
方法来初始化对象。 new
方法可以被类派生类覆盖。new
方法通常用于实现更高级的对象创建逻辑。init
方法init
方法由对象调用,而不是由类调用。- 它在对象创建之后被调用。
- 它负责初始化对象属性和执行其他必要的初始化操作。
init
方法可以被类派生类覆盖。init
方法通常用于设置对象属性并执行其他初始化操作。示例
下面是一个示例,演示了
new
和init
方法的用法:
“`python
class MyClass:
def new(cls, value):
if value < 0:
return None # 不创建负值对象
return super().new(cls)def __init__(self, value): self.value = value
obj = MyClass(5) # 创建一个 value 为 5 的对象
obj2 = MyClass(-1) # 不创建 value 为 -1 的对象
“`总结
综上所述,
new
方法用于在创建对象之前控制对象创建过程,而init
方法用于在创建对象之后初始化对象。这两个方法在 Python 中对象创建和初始化过程中扮演着至关重要的角色。问答
_new
和init_
方法有什么相同点?答:这两个方法都是特殊方法,在创建对象时执行初始化操作。
_new_
方法的主要作用是什么?答:控制对象创建过程,例如实现自定义类元类和代理模式。
_init_
方法的主要作用是什么?答:初始化对象属性和执行其他必要的初始化操作。
_new_
方法必须返回什么?答:一个对象,如果返回
None
,则不会创建对象。_init_
方法由谁调用?答:由对象调用。
原创文章,作者:王利头,如若转载,请注明出处:https://www.wanglitou.cn/article_17715.html