对于包和模块到python,我是新来者。 我试图在几个单独的隔间中剪切我的剧本。提高可读性和维护性。
我的问题如下:
我有一个模块,用于在此模块中定义一个类和一个实例化该类的函数。 模块blast.py
class Blast():
blabla
def foo():
blast = Blast()
# do some stuff
此模块位于包含_ _init__.py文件
的包中__all__ = ["blast"]
我有一个主脚本我想要使用该功能。 我用
导入模块from package import blast
但是要使用该功能,我必须使用模块的名称空间(至少我的IDE说我:pycharm)
blast.foo()
它有效吗?函数会看到它里面的类吗?
更一般地,我可以在我的命名空间中导入我的包的一些功能。我虽然这样做了,我从互联网上得到的答案对我没有帮助。
答案 0 :(得分:0)
是的,函数blast.foo()
会知道并找到类Blast
。
无论何时导入模块,部分或全部,都会加载整个模块 - 导入它的方式只是决定当前作用域中可用的类和函数,以及以何种方式。
例如,如果你这样称呼:
from package.blast import foo
只有函数foo()
可用,但整个包读取和加载。如果您尝试在同一个脚本中单独实例化类Blast
,则无效。
顺便说一句,如果您自定义__init__.py
,则可以使导入功能更方便。在你的情况下,如果你这样编辑它:
>>>__init__.py
from blast.py import Blast, foo
你可以像这样导入函数和类:
from package import Blast, foo
你__all__
参数不起作用的原因是因为它需要另一个import语句 - 主要是这样:
from package import *
使用您当前的__init__.py
调用此选项应该可以正常工作。
或许this post by Mike Grouchy能够澄清一些事情。