我是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模块搜索路径,则现在可以通过两种不同方式找到CardClass
和CardDeckClass
模块。您可以直接通过顶级名称(例如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.py
和CardDeckClass.py
文件放在文件夹中,您正在为它们创建一个程序包。在旧版本的Python(Python 3.3之前的版本)中,需要将名为__init__.py
的文件添加到文件夹,然后才能作为包使用。这不再是必需的(出于某种晦涩的原因,已对其进行了更改,请参见PEP 420及其所引用的PEP)。仍然建议添加__init__.py
文件,因为通常不需要将包作为“命名空间包”(如果您不知道什么是命名空间包,则不需要)。最后的建议:您的模块命名方案建议您正在创建的每个模块中只有一个类。这在Python中通常是不好的风格。与Java等其他语言不同,Python模块中包含许多类,函数和其他内容是很正常的。过多地拆分代码会使导入变得比所需复杂得多。在这种情况下,几乎应肯定将
CardClass
和CardDeckClass
模块组合在一起,因为它们处理的对象密切相关。将它们组合到您的game.py
文件中可能是最有意义的,尽管单独的cards
模块也可以。几乎可以肯定,这里不需要软件包。