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

如何让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())

关键修正点说明

  1. 给get_total添加@classmethod装饰器:
    这个装饰器让方法绑定到类而非实例,调用Square.get_total()或任意实例的s.get_total()时,会执行函数并返回计算结果,而不是返回函数对象本身。
  2. 同步更新类字典数据:
    在__init__初始化实例时将integer值存入instances字典,在square_me方法更新实例值后,同步更新字典中的对应条目,确保类字典中的数据和实例属性始终一致。
  3. 用实例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:55:44