如何避免创建值重复的对象?实现值唯一的实例复用类
这是个很棒的思路——要实现相同值对应唯一实例的效果,你已经找对了方向!这种模式属于「基于值的单例变体」,我把你的实现整理得更清晰,还补充了一些实用细节:
完整实现代码
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
相关产品推荐
相关产品推荐

