python中_ _ init _ _ 和 _ _ new _ _ 区别是什么?

Python__init____new__ 区别是什么?

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

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2024-03-20 12:28
下一篇 2024-03-20 12:36

相关推荐

公众号