<p>我会选择第二种选择,因为在我看来,它比第一种更清楚。您正在两点之间执行中点操作,而不是在某个点上执行中点操作。类似地,这个接口的自然扩展可以定义<code>dot</code>、<code>cross</code>、<code>magnitude</code>、<code>average</code>、<code>median</code>等。其中一些函数将对<code>Points</code>进行操作,而其他函数则可以对列表进行操作。使其成为一个函数可以使它们都具有一致的接口。在</p>
<p>将它定义为函数还允许它与呈现<code>.x</code><code>.y</code>接口的任何一对对象一起使用,而使其成为一个方法需要这两个对象中至少有一个是<code>Point</code>。在</p>
<p>最后,为了解决函数的位置问题,我认为将它与Point类放在同一个包中是有意义的。这将它放在同一个命名空间中,这清楚地表明了它与<code>Point</code>的关系,而且在我看来,它比静态或类方法更具python性。在</p>
<p><strong>更新:</strong>
进一步阅读<code>@staticmethod</code>vs包/模块的pythonicity:</p>
<p>在thomaswouter对问题<a href="https://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python/136138#136138">What is the difference between staticmethod and classmethod in Python</a>的回答和Mike Steder对<a href="https://stackoverflow.com/questions/5169257/init-and-arguments-in-python/5169458#5169458"><strong>init</strong> and arguments in Python</a>的回答中,作者指出相关函数的包或模块可能是更好的解决方案。托马斯·伍特说:</p>
<blockquote>
<p>[staticmethod] is basically useless in Python -- you can just use a module function instead of a staticmethod.</p>
</blockquote>
<p>迈克·斯特德评论道:</p>
<blockquote>
<p>If you find yourself creating objects that consist of nothing but staticmethods the more pythonic thing to do would be to create a new module of related functions.</p>
</blockquote>
<p>然而,codeape在下面正确地指出,<code>Point.midpoint(a,b)</code>的调用约定将与类型一起定位功能。BDFL似乎也值<code>@staticmethod</code>,因为<code>__new__</code>方法是<a href="http://www.python.org/download/releases/2.2/descrintro/#staticmethods" rel="nofollow noreferrer">^{<cd15>}</a>。在</p>
<p>出于上述原因,我个人倾向于使用一个函数,但似乎在<code>@staticmethod</code>和独立函数之间的选择很大程度上取决于旁观者。在</p>