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

Python继承中Circle类修改面积后半径不更新的问题及解决

问题原因

你的Circle类中,__radius属性仅在初始化方法__init__里计算一次。当调用set_area修改面积时,父类的__area被更新了,但Circle的__radius没有同步更新,所以后续调用get_radius返回的还是初始化时的旧值。

解决方案

有两种靠谱的解决方式:

方式一:重写set_area同步更新半径

在Circle类里覆盖父类的set_area方法,更新面积的同时重新计算半径:

import math


class Figure:
    def __init__(self, area):
        self.__area = area

    def set_area(self, area):
        self.__area = area

    def get_area(self):
        return self.__area


class Circle(Figure):
    def __init__(self, area):
        super().__init__(area)
        self.__radius = math.sqrt(self.get_area() / math.pi)

    def get_radius(self):
        return self.__radius
    
    # 重写set_area,同步更新半径
    def set_area(self, area):
        super().set_area(area)
        self.__radius = math.sqrt(self.get_area() / math.pi)


c = Circle(25)
print(c.get_area())
print(c.get_radius())  
c.set_area(100)
print(c.get_area())
print(c.get_radius())  # 现在会返回正确的新半径

方式二:动态计算半径(更推荐)

不需要把半径存在属性里,每次调用get_radius时都基于当前的面积实时计算,从根源避免不同步问题:

import math


class Figure:
    def __init__(self, area):
        self.__area = area

    def set_area(self, area):
        self.__area = area

    def get_area(self):
        return self.__area


class Circle(Figure):
    def __init__(self, area):
        super().__init__(area)

    def get_radius(self):
        # 每次调用都根据当前面积计算半径
        return math.sqrt(self.get_area() / math.pi)


c = Circle(25)
print(c.get_area())
print(c.get_radius())  
c.set_area(100)
print(c.get_area())
print(c.get_radius())  # 实时计算,结果始终正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:12:13