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

如何避免创建值重复的对象?实现值唯一的实例复用类

这是个很棒的思路——要实现相同值对应唯一实例的效果,你已经找对了方向!这种模式属于「基于值的单例变体」,我把你的实现整理得更清晰,还补充了一些实用细节:

完整实现代码
class A():
    # 用类属性存储所有已创建的实例
    instances = []
    
    def __init__(self, val):
        self.val = val
    
    @classmethod
    def new(cls, val):
        """返回已有相同值的实例,若不存在则创建新实例并返回"""
        # 遍历已存实例,检查是否有匹配的值
        for ins in cls.instances:
            if ins.val == val:
                return ins
        # 没有匹配的话创建新实例,加入存储列表后返回
        new_ins = cls(val)  # 这里用cls而非硬编码A,让子类也能复用逻辑
        cls.instances.append(new_ins)
        return new_ins

# 测试验证
a1 = A.new("x")
a2 = A.new("x")
a3 = A.new("y")

print(a1 is a2)  # 输出 True,确认是同一个实例
print(a1 is a3)  # 输出 False,不同值对应不同实例

核心逻辑说明

  • 类属性instances:作为所有实例的“仓库”,属于类本身,所有实例共享这个存储容器。
  • @classmethod的作用:让new方法可以直接通过类调用(比如A.new()),同时能访问类的属性和本身,这样后续如果创建子类,这个实例复用逻辑可以直接继承,不用重复写。
  • 实例复用判断:每次调用new时先遍历已存实例,找到匹配的val就直接返回现有实例;找不到才新建实例并加入仓库。

性能优化建议

如果需要处理大量不同值的实例,遍历列表的效率会比较低(时间复杂度O(n)),可以把instances改成字典,用val作为键、实例作为值,这样查找速度会提升到O(1):

class A():
    # 改用字典存储,键为val,值为对应实例
    instances = {}
    
    def __init__(self, val):
        self.val = val
    
    @classmethod
    def new(cls, val):
        """返回已有相同值的实例,若不存在则创建新实例并返回"""
        # 直接通过键查找,效率更高
        if val in cls.instances:
            return cls.instances[val]
        # 不存在则创建新实例并存入字典
        new_ins = cls(val)
        cls.instances[val] = new_ins
        return new_ins

这样在实例数量较多时,性能会有明显提升~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:09:01