文件夹结构:
<current dir>
main.py
packages <dir>
__init__.py
mod.py
主要py:
import packages
print packages.mod.hello()
mod.py:
def hello():
return 'hello'
__init__.py:
from packages import mod
如果我运行main.py
,则不会出错。但是,如果我编辑__init__.py
为'from packages import *'
,则会出现此错误:AttributeError:'module'对象没有属性'mod'
我不是在问如何使该'print'
命令起作用。我可以使用其他'import'
语法main.py
来使其工作。现在的问题是:我很好奇的是'from packages import mod'
在__init__.py
。如果我可以,import mod
那么当我替换为时import *
,这意味着导入所有内容,为什么我会收到错误消息?
那from packages import *
里面的真正含义是__init__.py
什么?
有人可以帮忙吗?谢谢
那from packages import *
里面的真正含义是__init__.py
什么?
该__init__.py
进口本身。
您只能导入模块,不能导入软件包。包只是模块或子包的容器。当您“导入”软件包时,您实际上是在导入模块__init__.py
。
在__init__.py
与此内容:
from packages import mod
将模块mod
导入__init__.py
。因此,它将在您的过main.py
孔中可用packages.mod
(请记住packages
由表示__init__.py
)。
当您将的内容更改__init__.py
为:
from packages import *
您正在导入模块__init__.py
(与您所在的文件相同)。此方法有效(第二次导入只会触发in的查找sys.modules
),但不会为您提供的内容mod
。
这意味着,您可以使用:
from module import *
但您不能明智地将其与空值一起使用__init__.py
:
from package import *
因为package
实际上是由表示的__init__.py
,所以目前还没有任何内容。您可以检查此内容(以交互方式或在文件中):
>>> import packages
>>> print(packages)
<module 'packages' from '/.../packages/__init__.py'>
在__init__.py
你可以这样写:
from packages.mod import *
然后在main.py
:
print packages.hello()
作品。因为该函数hello()
现在位于文件的全局名称空间中__init__.py
。
如mozman的答案中所述,您可以使用__all__
in__init__.py
列出应使用的模块(如果from packages import *
使用的话)。这是为此情况而设计的。
在__init__.py
只有这些内容:
__all__ = ['mod']
现在您可以在main.py
:
from packages import *
print mod.hello()
如果您扩展__init__.py
:
__all__ = ['mod']
from packages import *
您可以在main.py
以下位置执行此操作:
import packages
print packages.mod.hello()
但是,如果您from packages import *
从中删除__init__.py
:
__all__ = ['mod']
您将得到一个错误:
AttributeError: 'module' object has no attribute 'mod'
因为__all__
仅用于from packages import *
案例。现在我们回到__init__.py
进口本身。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句