Python中如何将类存储的用户输入值传递给其他类调用使用
问题原因
- 变量被意外覆盖:你在存储完用户输入的
Point类型坐标点p1/p2/p3后,实例化Polyline时重新创建了同名的p1/p2/p3实例,直接覆盖了之前存储用户输入的变量。新创建的Polyline实例初始化坐标默认是0,你调用setXY时传入的是新实例自身的0值,自然无法拿到用户输入的坐标。 - 类定义冗余重复:
Point、Polyline、Polygon三个类的setXY、距离计算逻辑完全一致,重复定义不仅增加冗余代码,还容易出现变量覆盖的问题。 - 类设计不合理:
Polyline和Polygon属于由点组成的几何图形,不需要自己单独存储坐标,直接接收已创建好的Point实例作为参数即可,不需要重复创建点对象。
修正后的代码
import math # 点类:存储坐标,提供两点距离计算能力 class Point(): def __init__(self, x=0, y=0): self.x = x self.y = y def setXY(self,x,y): self.x = x self.y = y # 计算当前点到另一个点的距离 def getDistance(self, p): return math.sqrt((self.x-p.x)**2+(self.y-p.y)**2) # 折线类:接收点列表计算各段长度 class Polyline(): def __init__(self, point_list): self.points = point_list def getSegmentLength(self): lengths = [] for i in range(len(self.points)-1): lengths.append(self.points[i].getDistance(self.points[i+1])) return lengths # 多边形类:接收点列表计算周长 class Polygon(): def __init__(self, point_list): self.points = point_list def getPerimeter(self): perimeter = 0 point_count = len(self.points) for i in range(point_count): next_i = (i+1) % point_count perimeter += self.points[i].getDistance(self.points[next_i]) return perimeter if __name__ == "__main__": # 初始化默认点 p1 = Point() p2 = Point() p3 = Point() point_list = [p1,p2,p3] print("\n----请选择以下操作:----") print("输入1 自定义点坐标") print("输入2 使用默认点坐标\n") val = int(input("输入你的选择: ")) if val == 1: # 依次设置三个点的坐标 for idx, p in enumerate(point_list, 1): x = int(input(f"输入P{idx}的x坐标: ")) y = int(input(f"输入P{idx}的y坐标: ")) p.setXY(x,y) # 打印所有点坐标 for idx, p in enumerate(point_list, 1): print(f"P{idx}的坐标是: ({p.x}, {p.y})") print("\n") # 计算折线各段长度 polyline = Polyline(point_list) seg_lengths = polyline.getSegmentLength() print(f"P1到P2的长度: {seg_lengths[0]}") print(f"P2到P3的长度: {seg_lengths[1]}") print(f"P1到P3的长度: {point_list[0].getDistance(point_list[2])}") print("\n") # 计算多边形周长 polygon = Polygon(point_list) print(f"多边形周长: {polygon.getPerimeter()}") print("\n")
修正说明
- 所有类定义移到代码最外层,避免重复定义和作用域问题
- 调整
Polyline和Polygon的设计,直接接收点列表作为入参,不需要重复创建点对象,彻底避免变量覆盖问题 - 优化坐标输入、打印的重复逻辑,用循环替代重复代码
- 你之前测试时所有点都输入3,三个点坐标完全重合,周长计算结果为0属于正常结果,如果输入不同坐标即可得到正常的长度和周长结果。
内容的提问来源于stack exchange,提问作者Jose Landivar
相关产品推荐
相关产品推荐

