Python OOP:Elements类如何使用Nodes实例属性及length声明问题
问题解答与代码优化建议
核心问题回应
1. 坐标传递实现方式
你已经在Elements的__init__方法中把start_node、end_node两个Nodes类实例挂载到了self上,不需要额外传参,直接在calc_length方法中通过实例属性访问坐标即可:
def calc_length(self): dx = self.start_node.xGlobal - self.end_node.xGlobal dy = self.start_node.yGlobal - self.end_node.yGlobal self.length = mt.sqrt(dx**2 + dy**2)
原代码中未定义的x_global_start等临时变量,完全可以通过已存储的Nodes实例直接取值,不需要绕路传参。
2. length属性的声明规则
Python的类实例属性没有强制要求必须在__init__中提前声明,完全可以在任意类方法中动态创建。但如果不提前声明,会出现一个调试坑:创建Elements实例后如果没有手动调用过calc_length,直接访问instance.length会抛出AttributeError。
推荐两种符合工程习惯的写法:
- 在
__init__中给length设置初始占位值(比如None),调用calc_length后再覆盖计算值 - 直接在
__init__内部自动调用calc_length,让实例创建时就自动完成长度计算,省去手动触发的步骤
另外,原__init__中把length作为入参完全冗余——长度是根据两个节点坐标派生的属性,不需要用户手动传入,可以直接从入参列表中删掉。
现有代码的问题修正
1. 节点坐标类型转换
通过input()获取的坐标默认是字符串类型,直接参与平方计算会触发类型错误,需要转为浮点型:
x_global_in = float(input('Global x coordinate [m] ')) y_global_in = float(input('Global y coordinate [m] '))
2. 节点存储结构调整
用np.zeros(shape=(num_of_nodes,3))存储Nodes实例的方式存在类型不兼容问题,np.zeros默认初始化数值类型数组,存自定义类实例容易出现隐式类型转换错误。对入门阶段来说,直接用普通Python列表存节点实例更易维护:
num_of_nodes = int(input('Enter the number of nodes: ')) arr_nodes = [] for i in range(num_of_nodes): print('Node', i,':') x_global_in = float(input( 'Global x coordinate [m] ' )) y_global_in = float(input( 'Global y coordinate [m] ' )) current_node = Nodes(i, x_global_in, y_global_in) arr_nodes.append(current_node)
如果后续需要用numpy做矩阵运算,等所有节点实例创建完成后,再单独把坐标值提取出来生成numpy数组即可,不需要把自定义的Nodes实例直接存在numpy数组里。
优化后的类参考实现
import math as mt import numpy as np class Nodes: def __init__(self, number, x_glob, y_glob): self.number = number self.xGlobal = x_glob self.yGlobal = y_glob class Elements: def __init__(self, number, start_node, end_node): self.number = number # 提前声明占位,避免未计算时访问报错 self.length = None self.start_node = start_node self.end_node = end_node # 实例创建时自动计算长度 self.calc_length() def calc_length(self): dx = self.start_node.xGlobal - self.end_node.xGlobal dy = self.start_node.yGlobal - self.end_node.yGlobal self.length = mt.sqrt(dx**2 + dy**2)
内容的提问来源于stack exchange,提问作者euler132
相关产品推荐
相关产品推荐

