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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:54:05