Python3.5.2:导入一个类,该类在子目录中导入另一个类

2024-10-03 19:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是stackoverflow和Python的新手,很抱歉这些错误。在

我在这个项目目录中有game.py。在

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

CardDeckClass使用CardClass。在

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

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

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

^{pr2}$

上面给出了第二行的一个错误CardDeckClass.py:from CardClass import CardClass

重要错误:没有名为“CardClass”的模块

关于如何解决这个问题有什么建议或想法吗?谢谢!在


Tags: 模块项目frompyimport目录projectgame
2条回答

通常子目录classes不在默认导入路径上。如果要从非标准子目录导入类,则必须将其添加到以下路径:

import sys
sys.path.append("./classes")

虽然DYZ的答案很有效,但我认为这给了你非常糟糕的建议。如果您将classes文件夹添加到Python模块搜索路径,那么现在可以用两种不同的方式找到CardClass和{}模块。您可以在顶层直接按名称获取它们(例如,import CardClass),也可以通过classes包(使用import classes.CardClass)获取。在

这种模糊性很糟糕,因为Python不会意识到这两个不同的名称应该指同一个事物。取而代之的是,你会得到所有东西的两个副本,这可能会让你很困惑。例如,isinstance(CardClass.CardClass(), classes.CardClass.CardClass)将是False。在

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

from classes.CardClass import CardClass

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

^{pr2}$

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

您可能没有意识到,将CardClass.pyCardDeckClass.py文件放在一个文件夹中,就是在为它们创建一个包。在早期版本的Python中(python3.3之前),您需要在文件夹中添加一个名为__init__.py的文件,然后它才能作为一个包工作。这已经不再是必要的(因为有点模糊的原因,它被改变了,参见PEP 420和它所指的政治公众人物)。仍然建议您添加一个__init__.py文件,因为您通常不需要您的包是“命名空间包”(如果您不知道什么是命名空间包,则不需要它)。在

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

相关问题 更多 >