首页 > 后端开发 > Python教程 > 为什么Python的`__init__()`总是在`__new__()`之后调用?

为什么Python的`__init__()`总是在`__new__()`之后调用?

Patricia Arquette
发布: 2024-12-18 17:36:10
原创
543 人浏览过

Why is Python's `__init__()` Always Called After `__new__()`?

理解 __init__() 和 __new__() 的顺序

在 Python 中, __new__() 和 __init__() 方法起着至关重要的作用在实例创建过程中。然而,许多开发人员想知道为什么 __init__() 总是在 __new__() 之后调用。

__new__() 的用途

__new__() 负责控制 __new__() 的创建一个新实例。它初始化实例的分配并返回实例本身。本质上,__new__() 决定是创建新实例还是重用现有实例。

__init__()

__init__() 的用途用于对象初始化。它设置实例的属性并运行任何必要的设置代码。 __init__() 不会返回任何内容,因为它的主要目的是初始化对象的状态。

实例创建中的顺序

实例创建中的顺序始终是:

  1. 首先调用 __new__() 来分配并可能返回现有的
  2. 如果 __new__() 返回一个新实例,则调用 __init__() 来初始化该实例。

示例

下面的例子说明了 __new__() 如何控制实例创建:

class A(object):
    _dict = dict()

    def __new__(cls):
        if 'key' in A._dict:
            print("EXISTS")
            return A._dict['key']
        else:
            print("NEW")
            return super(A, cls).__new__(cls)

    def __init__(self):
        print("INIT")
        A._dict['key'] = self
        print("")

a1 = A()
a2 = A()
a3 = A()
登录后复制

输出:

NEW
INIT

EXISTS
INIT

EXISTS
INIT
登录后复制

如您所见,__new__() 首先检查 _dict 中是否已存在实例。如果是,则返回该现有实例。否则,它创建一个新实例并返回它。然后调用 __init__() 来初始化每个实例。

使用 __new__() 的替代方案

大多数情况下,使用 __new__() 来实现您自己的享元设计模式不推荐。相反,请考虑使用工厂类或对象池来管理实例的创建和重用。

以上是为什么Python的`__init__()`总是在`__new__()`之后调用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板