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

为什么在Python的对象创建中`__init__()`总是在`__new__()`之后调用?

DDD
DDD原创
2024-12-19 15:47:11458浏览

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

“__init__()”和“__new__()”:顺序和目的

“__init__()”和“__new__()”是Python面向对象编程中的基本方法,用于控制实例创建和初始化。

“__new__()”负责分配内存并创建类的新实例,返回新创建的对象。它负责实例的实际创建。

相反,“__init__()”初始化新创建的实例。它负责设置实例的属性并执行任何必要的操作来准备对象以供使用。

Python 的设计规定,在实例创建过程中,始终在“__new__()”之后调用“__init__()” 。这是因为新实例在创建后需要初始化。

享元模式和“__init__()”调用

在享元模式的上下文中,您可能会对在“__new__()”之后调用“__init__()”的预期行为感到困惑。这是因为享元模式通常利用“__new__()”来控制实例创建并避免创建同一对象的多个副本。

在示例代码中,您已经实现了一个自定义的“__new__()”方法来根据字典中键的存在来处理实例创建。但是,您可能希望仅调用“__init__()”方法一次,即使对于使用享元模式创建的后续实例也是如此。

为什么“__init__()”总是在“之后调用” __new__()"?

这种行为的原因是Python的面向对象系统期望创建的每个实例都通过调用来初始化“__init__()”。这是实例创建过程的基本部分,确保对象完全准备好使用。

替代实现

实现享元模式并避免调用“ __init__()" 多次,您应该使用工厂类而不是覆盖 "__new__()"。这被认为是一种更稳健和标准的方法。

这是一个基于工厂的享元实现的示例:

class FlyweightFactory:
    _cache = {}

    def __get(key):
        if key not in FlyweightFactory._cache:
            FlyweightFactory._cache[key] = Flyweight(key)
        return FlyweightFactory._cache[key]

class Flyweight:
    def __init__(self, key):
        self.key = key

在此实现中,工厂类基于关键,避免需要多次“__init__()”调用。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn