“__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中文网其他相关文章!