模块中的导入函数是否可以从该模块访问类?

时间:2016-10-21 08:37:43

标签: python-3.x module

对于包和模块到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()

它有效吗?函数会看到它里面的类吗?

更一般地,我可以在我的命名空间中导入我的包的一些功能。我虽然这样做了,我从互联网上得到的答案对我没有帮助。

1 个答案:

答案 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能够澄清一些事情。