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
相关产品推荐
相关产品推荐

