<p>虽然DYZ的答案很有效,但我认为这给了你非常糟糕的建议。如果您将<code>classes</code>文件夹添加到Python模块搜索路径,那么现在可以用两种不同的方式找到<code>CardClass</code>和{<cd3>}模块。您可以在顶层直接按名称获取它们(例如,<code>import CardClass</code>),也可以通过<code>classes</code>包(使用<code>import classes.CardClass</code>)获取。在</p>
<p>这种模糊性很糟糕,因为Python不会意识到这两个不同的名称应该指同一个事物。取而代之的是,你会得到所有东西的两个副本,这可能会让你很困惑。例如,<code>isinstance(CardClass.CardClass(), classes.CardClass.CardClass)</code>将是<code>False</code>。在</p>
<p>相反,您应该修复<code>CardDeckClass.py</code>中的导入,以正确导入<code>CardClass</code>。有两种方法可以做到这一点,而你想要的是风格问题(没有一个正确的选择)。您可以使用绝对导入,除了命名模块名称外,还可以命名包:</p>
<pre><code>from classes.CardClass import CardClass
</code></pre>
<p>或者也可以使用显式相对导入</p>
^{pr2}$
<p>注意模块名开头的点,它告诉Python在当前包中开始搜索。在</p>
<p>您可能没有意识到,将<code>CardClass.py</code>和<code>CardDeckClass.py</code>文件放在一个文件夹中,就是在为它们创建一个包。在早期版本的Python中(python3.3之前),您需要在文件夹中添加一个名为<code>__init__.py</code>的文件,然后它才能作为一个包工作。这已经不再是必要的(因为有点模糊的原因,它被改变了,参见<a href="https://www.python.org/dev/peps/pep-0420/" rel="nofollow noreferrer">PEP 420</a>和它所指的政治公众人物)。仍然建议您添加一个<code>__init__.py</code>文件,因为您通常不需要您的包是“命名空间包”(如果您不知道什么是命名空间包,则不需要它)。在</p>
<p>最后一个建议:模块命名方案建议您创建的每个模块中只有一个类。这在Python中通常是不好的风格。与Java等其他语言不同,Python模块中有许多类、函数和其他东西是很正常的。过多地拆分代码会使导入变得比需要的复杂得多。在这种情况下,<code>CardClass</code>和{<cd3>}模块几乎可以肯定地组合在一起,因为它们处理的是密切相关的对象。将它们组合到您的<code>game.py</code>文件中可能是最有意义的,不过单独的<code>cards</code>模块也可以。几乎可以肯定的是这里不需要一个包裹。在</p>