为何实例化Circle类的一个对象会改变另一个对象调用方法的结果?
问题根源:类变量的共享特性
你误解了Python中类变量的作用域。Circle类里的all_circles是类级别的变量,所有Circle的实例都会共享同一个列表对象,而不是每个实例拥有独立的副本。
你的代码执行逻辑拆解
- 当执行
c1 = Circle(10)时,__init__方法会把当前实例c1添加到Circle.all_circles列表,此时列表内容为[c1]。 - 执行
c2 = Circle(15)时,同样把c2添加到同一个all_circles列表,此时列表内容变为[c1, c2]。 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
相关产品推荐
相关产品推荐

