我正在学习 Python,在学习模块时,我想到了两个疑问。
疑问#1:
我知道模块只是简单的 python 文件,例如
filename.py,但是 Python 中的子模块是什么?疑问 #2:
考虑以下三行代码:
import modulename from pkgname import modulename from pkgname import *是所有三个语句都使用
__init__.py(在pkgname包内)还是仅使用第三个语句?
请您参考如下方法:
为了让你的第二个问题更清楚一些。
当你这样做时——
import packagename.modulename
或
from packagename import modulename
Python 内部首先导入 packagename ,当我说 python imports packagename ,我的意思是它导入了 __init__.py那个包,然后导入 modulename .这就是为什么当您执行上述任何操作时它会导入 __init__.py 的原因。 .
当你这样做时——
from packagename import *
请注意,这不会导入 modulename默认情况下来自 packagename,这只会导入 __init__.py来自 packagename ,以及您在 __all__ 中列出的所有模块列于__init__.py ,如果该列表中没有列出任何模块,则不会导入任何模块。示例 -
假设我有
shared
-- __init__.py
-- a.py
__init__.py看起来像-
print("In Shared")
a.py看起来像-
print("In A")
现在在上面的目录中shared ,并打开 python,如果你这样做 -
from shared import *
它会打印出来——
In Shared
但是,如果您更改 __init__.py 中的代码到 -
print("In Shared")
__all__ = ['a']
然后从相同的位置进行相同的导入,它会打印出来-
In Shared
In A
如您所见,它只导入在 __all__ 中定义的子模块。列表。
最后,当你这样做时 -
import modulename
假设您直接从 packagename 中执行此操作,通过将目录更改为它并在那里打开 python 交互式解释器。那时,您并没有要求 Python 为您导入 packagename,因此它不需要导入 packagename,因此它不会导入 __init__.py。 .
