擅长:python、mysql、java
<p>这将是建议的结构:</p>
<pre><code>from my_app.utils import com
com.Mail().email_category1(template, ...)
</code></pre>
<p>其中<code>my_app.utils.com</code>是:</p>
<pre><code>Mail = CommunicationMail
</code></pre>
<hr/>
<p>如果你真的想保留<code>com.mail.email_category1</code>符号,Python当然会让你成为动态语言
(<a href="https://docs.python.org/3/reference/datamodel.html#object.__getattr__" rel="nofollow">^{<cd3>} documentation</a>):</p>
<pre><code># my_app.utils.com
class CommunicationMailFactory:
def __getattr__(self, name):
instance = CommunicationMail()
return getattr(instance, name)
mail = CommunicationMailFactory()
</code></pre>
<hr/>
<p><strong>但是使用第一种方法!</strong>你会问“为什么”。你知道吗</p>
<p>首先,它清楚地表明了您在做什么:您正在实例化一个新实例并调用一个方法。这对于<code>__getattr__</code>黑客来说并不清楚。你知道吗</p>
<p>第二,您可以将新实例化的实例分配给变量<code>mail1</code>,然后调用<code>mail1.email_category1(subject, template, ...)</code>或其他什么。对于<code>__getattr__</code>hackery,您没有这种正常的、预期的灵活性。你知道吗</p>