<p>Python是一种<a href="https://docs.python.org/2.7/glossary.html#term-duck-typing" rel="nofollow noreferrer"><em>"duck-typed"</em></a>语言;如果它走路像鸭子,嘎嘎叫得像鸭子,那它就是鸭子!或者,在实现方面,如果作为<code>mailReq</code>传递的对象具有<code>from</code>、<code>to</code>、<code>subject</code>和<code>text</code>属性,<em>它是否是<code>MailRequest</code>并不重要。在</p>
<p>如果您想记录接口(这当然是一个好主意),通常使用<a href="https://www.python.org/dev/peps/pep-0257/" rel="nofollow noreferrer">docstrings</a>来完成。我喜欢<a href="http://sphinxcontrib-napoleon.readthedocs.org/en/latest/example_google.html" rel="nofollow noreferrer">the Google style</a>,它可以与<code>sphinx-napoleon</code>一起使用,以自动生成人类可读的文档,但也可以使用其他文档。在</p>
<pre><code>def send_email(self, mailReq):
"""Send an email.
Args:
mailReq (MailRequest): the configuration for the email.
"""
...
</code></pre>
<hr/>
<p>至于您的第二个问题:将大量参数包装到容器对象中是一个<a href="http://sourcemaking.com/refactoring/introduce-parameter-object" rel="nofollow noreferrer">pretty common pattern</a>。在Python中,您可以选择使用<em>“<code>**kwargs</code>magic”</em>(参见例如<a href="https://stackoverflow.com/q/36901/3001761">What does ** (double star) and * (star) do for parameters?</a>):</p>
^{pr2}$
<p><em>(注意,<code>from</code>是Python中的关键字,因此不能是参数的名称)。</em></p>
<p>这样做的好处是可以合理地自我文档化——有四个必需的参数,外加一些任意的附加关键字配置选项(同样,这通常会记录在docstring中)。在</p>