<p>所有的方法都是有效的,完全依赖于你的主题领域和功能的划分,关注点的分离。换句话说,<strong>取决于</strong>。</p>
<p>例如,您可以有一个类,它的公共API有两个方法,这两个方法都依赖于您认为是私有的第三个方法。作为开发人员,您可以选择不将第三个方法作为公共API的一部分,但是它在您的源代码中:</p>
<pre><code>class FooAPI(object):
def publicMethodOne(*args, **kw):
return self._privateMethod(1, *args, **kw) + 7
def publicMethodTwo(*args, **kw):
return self._privateMethod(2, *args, **kw) + 11
def _privateMethod(somevalue, *args, **kw):
return somevalue * 3
</code></pre>
<p>在这种情况下,API的用户绝对不需要直接调用<code>_privateMethod</code>,并将其返回值传递给<code>publicMethod</code>。</p>
<p>但是,如果您觉得API的使用者应该为您的方法提供特定的信息,在大多数情况下,有一个简单的默认方法可以为他们计算特定的信息,那么您需要传入该默认方法的返回值。这样,这些消费者也可以使用自己的计算方法,并使用这些值<em>,而不是</em>:</p>
<pre><code>def publicMethod(value1, value2):
return value1 / value2
def mostCommonValues():
return (1.0, 4.0)
publicMethod(*mostCommonValues())
publicMethod(4, 2)
</code></pre>
<p>何时使用实例变量?只有当函数的返回值要与实例一起持久化时,才能反映该实例的内部状态。</p>
<p>例如,如果您的类表示一辆车,那么应用程序</em>在对该车的两次操作之间存储该车的位置可能是有意义的。所以如果你想知道它现在是否需要为红绿灯停车,首先调用<code>updatePosition()</code>方法,然后使用另一种方法计算到红绿灯的距离。您不会将<code>updatePosition()</code>调用的输出传递给距离计算方法,您只需更新实例中的位置。</p>
<p>但是,如果需要更新碰撞中汽车的位置,则需要从汽车中获取数据(基于汽车上调用的方法的返回值),并结合外部信息(其他对象的位置、路面的阻力等)反馈到汽车上的<code>updatePosition</code>方法中。因为您现在需要从car实例外部的<em>添加附加信息,所以您必须通过公共API将值从一个方法调用传递到另一个方法调用。</p>
<p>请记住,软件开发更多的是一种艺术形式,而不是一个严格的工程纪律,因此,如何做到这一点的答案因开发人员而异,也因软件项目而异。从来没有人回答。试着让它清晰明了,自然。</p>