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
相关产品推荐
相关产品推荐

