如何让Square类追踪所有实例总值,支持类与实例访问
Square类实例总值追踪问题修正
需求回顾
- Square类每个实例的
integer属性初始值为2 - 调用
square_me()方法会将integer值自乘 - 需要实现类能追踪所有实例的
integer总值,且该总值可通过类本身或任意实例访问
问题分析
用户尝试用类属性instances字典存储各实例的integer值,通过sum(Square.instances.values())能得到正确总值,但get_total方法无法返回正确结果——直接调用Square.get_total会返回函数对象,原因是该方法未被正确定义为类方法,无法直接通过类或实例触发执行。
修正后的代码
class Square: # 类属性:存储所有实例的integer值,用实例id作为唯一键 instances = {} def __init__(self): self.integer = 2 # 初始化时将实例值存入类字典 Square.instances[id(self)] = self.integer def square_me(self): self.integer *= self.integer # 更新实例值后同步更新类字典 Square.instances[id(self)] = self.integer @classmethod def get_total(cls): # 计算并返回所有实例的integer总值 return sum(cls.instances.values())
关键修正点说明
- 给
get_total添加@classmethod装饰器:
这个装饰器让方法绑定到类而非实例,调用Square.get_total()或任意实例的s.get_total()时,会执行函数并返回计算结果,而不是返回函数对象本身。 - 同步更新类字典数据:
在__init__初始化实例时将integer值存入instances字典,在square_me方法更新实例值后,同步更新字典中的对应条目,确保类字典中的数据和实例属性始终一致。 - 用实例id作为字典键:
避免不同实例因某些原因出现键冲突,保证每个实例在字典中有唯一的条目。
验证示例
# 创建实例 s1 = Square() s2 = Square() # 初始总值:2 + 2 = 4 print(Square.get_total()) # 输出4 # 调用square_me更新实例值 s1.square_me() # s1.integer变为4 # 更新后总值:4 + 2 = 6 print(s2.get_total()) # 输出6
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

