我是stackoverflow和Python的新手,所以为您的错误感到抱歉。

我在该项目目录中有game.py

我在classes子目录中有两个类,CardClass和CardDeckClass。

CardDeckClass使用CardClass。

/project/game.py
/project/classes/CardClass.py
/project/classes/CardDeckClass.py


我在将CardDeckClass导入到game.py时遇到问题

到目前为止,我已经尝试过了:

*CardClass.py*
class CardClass:
    ##functionality for CardClass

*CardDeckClass.py*
from random import shuffle
from CardClass import CardClass
class CardDeckClass:
    ##functionality for CardDeckClass

*game.py*
from classes.CardDeckClass import CardDeckClass

testDeck = CardDeckClass()
print("Amount of cards in deck: ", testDeck.getCardCount())


上面的代码在CardDeckClass.py的第二行给我一个错误:from CardClass import CardClass

ImportError:没有名为“ CardClass”的模块

有关如何解决此问题的任何提示或想法?谢谢!

最佳答案

虽然DYZ的答案有效,但我认为这给您的建议很糟糕。如果将classes文件夹添加到Python模块搜索路径,则现在可以通过两种不同方式找到CardClassCardDeckClass模块。您可以直接通过顶级名称(例如import CardClass)或通过classes软件包(使用import classes.CardClass)获得它们。

这种歧义是不好的,因为Python不会意识到两个不同的名称应该引用同一件事。相反,您将获得所有内容的两个副本,这可能会非常令人困惑。例如,isinstance(CardClass.CardClass(), classes.CardClass.CardClass)将为False

相反,您应该修复CardDeckClass.py中的导入以正确导入CardClass。有两种方法可以做到,而您想要的只是样式问题(没有一个正确的选择)。您可以使用绝对导入,除了模块名称外,还可以命名包:

from classes.CardClass import CardClass


或者,您可以使用显式相对导入

from .CardClass import CardClass


注意模块名称开头的点,它告诉Python开始在当前包中搜索。

您可能没有意识到,通过将CardClass.pyCardDeckClass.py文件放在文件夹中,您正在为它们创建一个程序包。在旧版本的Python(Python 3.3之前的版本)中,需要将名为__init__.py的文件添加到文件夹,然后才能作为包使用。这不再是必需的(出于某种晦涩的原因,已对其进行了更改,请参见PEP 420及其所引用的PEP)。仍然建议添加__init__.py文件,因为通常不需要将包作为“命名空间包”(如果您不知道什么是命名空间包,则不需要)。

最后的建议:您的模块命名方案建议您正在创建的每个模块中只有一个类。这在Python中通常是不好的风格。与Java等其他语言不同,Python模块中包含许多类,函数和其他内容是很正常的。过多地拆分代码会使导入变得比所需复杂得多。在这种情况下,几乎应肯定将CardClassCardDeckClass模块组合在一起,因为它们处理的对象密切相关。将它们组合到您的game.py文件中可能是最有意义的,尽管单独的cards模块也可以。几乎可以肯定,这里不需要软件包。

08-25 21:45