我正在为Python编写一些3D数学类。我想在以下方面创建一个与Vec3分开的Point3类:
Point3 - Point3 = Vec3
Point3 + Vec3 = Point3
否则,您可以在Point3上执行Vec3上的所有操作。这样做的动机是将点的数学概念与向量分开,希望能够实现更清晰的类型分离和更易于理解的API。
但是,使用Python的鸭子打字以及期望某个界面而不管类型的常见做法,使用Vec3会更好吗?它效率更高吗?
答案 0 :(得分:3)
我认为这不是特别不合理的。在具有相同域的情况下区分类型并且当一个具有特定的引用框架(例如时区)时,并不是很不寻常。因为一个点是向量和原点的总和,所以在某些区域对其进行编码是合理的。办法。
答案 1 :(得分:3)
这似乎是多余的。如果你考虑一下,笛卡尔空间中的一个点完全等同于从原点开始的束缚向量。听起来你可能为自己做了很多工作。
答案 2 :(得分:1)
我理解你的论点。我也一直在努力学习积分课程。根据我的经验,采用更实用的方法并根据列表/元组的函数编写API更好(尽管我猜也许不是“更多pythonic”)。
我认为,对此的主要反对意见是,你可能想要一种简洁的方式来编写简单的代数运算(总和等。),但为此我建议使用numpy。 numpy不仅支持元素添加,而且通过矩阵运算等方式为您提供将来可能需要它的效率。
同时,当您说想要一个干净的API时,除了文档之外,您添加到API的差异将是不可见的。实际上,一个看不见的API并没有那么有用。
我知道这与你最初的问题完全不同,但我怀疑它是长期最好的设计( ie 随着你的图书馆的发展,你想要支持更加雄心勃勃的点转换,批处理,等。,等。)。
答案 3 :(得分:1)
是的,这是糟糕的设计,因为增加或减少两点没有概念意义。
但是,您可以向点添加矢量(获取点)或添加两个矢量(获取矢量),因此听起来您只是将点与矢量混淆。
点不是矢量,但可以以一个实现。在编程中,我们使用组合模拟“使用组合实现”关系 - Point
类将包含一个私有Vector
实例,并使用它来处理它暴露的任何方法的逻辑。
事实上,因为Vector
已经可以完成Point
可以做的所有相同的事情(加上更多),你可能想要考虑甚至不打扰进行区分,并且只使用{ {1}}类,根本没有Vector
类。这是否是一个好主意取决于您的API将用于什么。