You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何实现构造函数传入同类实例时返回原对象?

自定义File类实现传入已有实例直接返回原对象的方案

确实需要重写__new__方法来实现该需求,这也是pathlib.Path内部采用的实现逻辑,符合Python的实例化流程规范。

实现原理

Python实例化类的过程中,会先调用__new__方法申请内存创建实例对象,之后才会调用__init__方法对实例做初始化。我们可以在__new__阶段先判断传入的参数是否为当前类的已有实例,如果是就直接返回该实例,跳过后续的创建和初始化流程。

完整代码示例

from pathlib import Path

class File:
    def __new__(cls, path=None, *args, **kwargs):
        # 检测第一个参数是否为当前类的实例
        if isinstance(path, cls):
            # 直接返回已有实例,不会再触发__init__执行
            return path
        # 非已有实例的场景,正常创建新实例
        return super().__new__(cls)

    def __init__(self, path):
        # 正常的初始化逻辑,仅新创建的实例会执行该方法
        self.path = Path(path)

    # 可选,和Path的相等判断逻辑对齐
    def __eq__(self, other):
        return isinstance(other, File) and self.path == other.path

测试验证

f1 = File("some/path")
f2 = File(f1)

print(f1 is f2) # 输出True,说明两个变量指向同一个对象
print(f1 == f2) # 输出True,相等判断符合预期

注意事项

  • 返回已有实例时不会触发__init__的执行,避免了重复初始化的副作用,符合需求预期
  • 如果只需要两个实例相等、不需要完全是同一个内存对象,也可以仅实现__eq__方法,但你要求的直接返回原对象的需求必须通过重写__new__实现

内容的提问来源于stack exchange,提问作者opnightfall1771

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:45:03