2016-10-21 82 views
0

当谈到封装和模块到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

看看我的回答是否有帮助 – nlsdfnbch

+0

如果它回答你的问题,考虑将其标记为接受。 – nlsdfnbch

回答

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__参数不工作的原因,是因为它需要另一个进口声明 - 主要是:

from package import * 

与您当前的__init__.py调用此应该按预期工作。

也许this post by Mike Grouchy能够澄清的东西多一点。

+0

比大多数网友在网上找到的感谢更清楚的解释。 –

相关问题