返回一个对象与返回一个元组

Ste*_*ini 11 python

我在python中开发了一个文件类,可以读取和写入一个包含xyz坐标列表的文件.在我的程序中,我已经有一个Coord3D类来保存xyz坐标.

我的问题是关于getCoordinate(index)方法的设计.我应该返回一个浮点元组还是一个Coord3D对象?

在第一种情况下,我得到非常低的耦合,但是我可能不得不用获得的值实例化Coord3D对象,尽管在文件类之外.在第二种情况下,我将使文件类与Coord3D类紧密耦合.

请注意,我认为两种解决方案之间没有太大差异,但我想了解您的答案及其背后的原因.


编辑:回顾我到现在为止的答案,看起来没有明确的选择.有人说(适当地)python不是Java,并且你不需要专门的类来处理所有事情,因为你需要语言架构.但是,在我的情况下,我有以下条件:

  1. 我正在使用一个库,其中Coord3D对象按原样使用.使用它会增加我的库的凝聚力,因为统一使用数据类型.
  2. Coord3D对象具有状态和行为.实际上,Coord3D对象聚合单个实体中的坐标和单位.Coord3D对象之间的操作将考虑可能不同的单元,并相应地采取行动.
  3. 我可以将集中控制代码放入Coord3D类实例中以拒绝,例如,长度为4或非单位的数组.如果我使用元组,我无法执行此检查.此外,如果一个方法接受Coord3D,有点保证它是预先形成的(你可以加粗并检查isinstance,或检查界面).元组可以包含无效数据.虽然在故障发生的地方完成了python处理错误的方法,但是一个阻止我用三个字符串组成的xyz坐标的类在某种程度上是有益的(请纠正我,如果错的话,请)

另一方面,使用元组具有以下优点:

  1. 少占用资源,在巨大的情况下非常关键
  2. 设计更简单.更多类意味着更复杂的设计.元组是一种标准数据类型,很容易理解,可以轻松解压缩.个性化的课程不是.
  3. 使用元组,XYZFile类与库的其余部分完全分离(因为它不使用Coord3D对象).这意味着它可以作为一个独立的实体完全重用.

进一步评论非常欢迎!

Joh*_*uhy 13

妥协解决方案:而不是一个类,使Coord3D成为一个namedtuple并返回:-)

用法:

Coord3D = namedtuple('Coord3D', 'x y z')

def getCoordinate(index):
    # do stuff, creating variables x, y, z
    return Coord3D(x, y, z)
Run Code Online (Sandbox Code Playgroud)

返回值可以完全用作元组,并具有相同的速度和内存属性,因此您不会失去任何通用性.但是,你也可以按名称访问它的值:如果c是的结果getCoordinate(index),那么你就可以工作c.x,c.y等等,以增加可读性.

(显然,如果您的Coord3D类还需要其他功能,这样做有点不太有用)

[如果你不在python2.6上,你可以从食谱中获取命名元素]


syk*_*ora 1

我也问过自己同样的问题,尽管是在做二维几何的时候。

我为自己找到的答案是,如果我计划编写一个更大的库,具有更多功能等等,请继续返回 Point,或者在您的情况下返回 Coord3D 对象。如果这只是一个 hacky 实现,那么元组会让你进展得更快。最后,这只是你要用它做什么,以及它是否值得付出努力。