Point3类与Vec3类分开是否不符合Python风格?

0 投票
4 回答
913 浏览
提问于 2025-04-17 00:44

我正在为Python编写一些3D数学类。我想创建一个叫做Point3的类,它和Vec3有以下不同之处:

Point3 - Point3 = Vec3
Point3 + Vec3 = Point3

除此之外,你可以对Point3进行的所有Vec3操作都是一样的。这样做的目的是为了把数学上“点”的概念和“向量”的概念分开,希望能让类型更加清晰,API(应用程序接口)也更容易理解。

不过,考虑到Python的鸭子类型(也就是只看对象的行为而不是类型)和通常情况下不管类型如何都期待某种接口的做法,直接使用Vec3会不会更好?这样做效率更高吗?

4 个回答

1

是的,这种设计很糟糕,因为把两个点相加或相减没有什么实际意义。

不过,你可以把一个向量加到一个点上(得到一个新的点),或者把两个向量相加(得到一个新的向量),所以听起来你只是把点和向量搞混了。

点和向量是不同的东西,但点可以用向量来表示。在编程中,我们用一种叫做组合的方式来处理这种“用某种方式实现”的关系——比如,Point类会包含一个私有的Vector实例,并用它来处理它所提供的方法的逻辑。

实际上,因为Vector已经可以做所有Point能做的事情(甚至更多),你可能根本不需要区分这两者,直接使用Vector类就可以,不用创建Point类。是否这样做是个好主意,取决于你的API将如何使用。

3

我觉得这并不是特别不符合Python的风格。区分类型在它们属于同一领域时并不算太奇怪,但当其中一个有特定的参考框架,比如时区时,就更有必要了。因为一个点可以看作是一个向量和原点的总和,所以用某种方式来表示这一点是合理的。

3

这听起来有点多余。如果你仔细想想,笛卡尔空间中的一个点其实和一个从原点出发的有界向量是完全一样的。这样做似乎是在给自己增加很多不必要的工作。

撰写回答