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

为何实例化Circle类的一个对象会改变另一个对象调用方法的结果?

问题根源:类变量的共享特性

你误解了Python中类变量的作用域。Circle类里的all_circles是类级别的变量,所有Circle的实例都会共享同一个列表对象,而不是每个实例拥有独立的副本。

你的代码执行逻辑拆解

  1. 当执行c1 = Circle(10)时,__init__方法会把当前实例c1添加到Circle.all_circles列表,此时列表内容为[c1]。
  2. 执行c2 = Circle(15)时,同样把c2添加到同一个all_circles列表,此时列表内容变为[c1, c2]。
  3. total_area()是静态方法,内部直接遍历Circle.all_circles计算所有圆的面积总和,所以不管通过c1.__class__还是c2.__class__调用,本质都是访问同一个类的共享列表,结果自然是两个圆的面积之和:314.159 + 706.85775 = 1021.01675。

你的预期错误原因

你误以为每个Circle实例会拥有独立的all_circles列表,但实际上类变量是绑定在类本身的,所有实例共享同一份数据。如果要实现“每个实例只统计自己的面积”,根本不需要all_circles,直接调用实例的area()方法即可:

c1 = Circle(10)
c2 = Circle(15)
print(c1.area())  # 输出314.159
print(c2.area())  # 输出706.85775

补充:类方法total_area2的作用

total_area2作为类方法,用cls参数代替直接引用Circle类,这是为了支持继承场景。比如如果定义Circle的子类,子类调用total_area2时,cls会指向子类本身,而不是父类Circle,这样能正确统计子类实例的总面积。但在当前没有子类的情况下,它和total_area的行为完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:05:30