当您调用 import models.Sentence 时,您是在告诉 Python 加载您的 Sentence.py 文件,并将其所有变量放入 models.Sentence 命名空间中。因此,您的Sentence 类也列在models.Sentence 下,因此它变为models.Sentence.Sentence。
就使用__init__.py而言,您可以在该文件中放入类似这样的内容:
from .Sentence import * # or import Sentence if that's all you want
然后在你的base.py:
import models
my_sentence = models.Sentence("arg")
您的__init__.py 现在所做的是将Sentence.py 中的所有内容加载到它自己的命名空间中,而不是models.Sentence。这意味着您的 Sentence 课程不再是 models.Sentence.Sentence,现在只是 models.Sentence。
注意:如果您希望能够将__init__.py 文件作为主文件运行,或运行models 文件夹中的任何脚本,则应将此代码放在__init__.py 中:
import __main__, os
if os.path.dirname(__main__.__file__) == os.path.dirname(__file__):
# executed script in this folder
from Sentence import *
else:
# executed script from elsewhere
from .Sentence import *
编辑:
要了解为什么需要使用models.Sentence.Sentence('arg'),让我们看一个更清晰的示例:
假设我有一个名为package 的模块。在那个模块中,我有子模块this_useful_part.py。
这是文件夹结构:
main.py
package
this_useful_part.py
在this_useful_part.py:
class my_very_helpful_class:
pass
在main.py:
import package.this_useful_part
my_instance = package.this_useful_part.my_very_helpful_class()
(我意识到我可能没有选择最好的名字)
我需要package.this_useful_part.my_very_helpful_class,而你需要models.Sentence.Sentence的原因是因为类不是文件,而是存储在文件中,文件不是 文件夹,但存储在文件夹中。
解决方法:
我希望这可以解决问题。
编辑 2:
经过更多研究,我发现可以使模块可调用。 (来自here)
如果您将Sentence.py 文件中的代码更改为以下代码,则不需要__init__.py 文件:
import sys
class Sentence:
def __init__(self, arg):
self.arg = arg
sys.modules[__name__] = Sentence
你现在可以做
import models.Sentence
my_sentence = models.Sentence('arg')
对不起,我的错误。