2013-09-01 77 views
7

我对如何使用numpy的库有问题。当我导入numpy时,我可以访问许多内置的类,函数和常量,例如numpy.array,numpy.sqrt等。具有子模块和功能的Python模块

但是在numpy中还有其他子模块,如numpy.testing。

这是如何完成的?在我有限的经验中,带有子模块的模块只是一个带有init .py文件的文件夹,而带有函数/类的模块是实际的python文件。如何创建一个也有函数/类的模块“文件夹”?

回答

17

具有.py文件和__init__.py的文件夹被称为package。其中一个包含类和函数的文件是module。文件夹嵌套可以为您提供子包。

因此,举例来说,如果我有以下结构:

mypackage 
    __init__.py 
    module_a.py 
    module_b.py 
     mysubpackage 
      __init__.py 
      module_c.py 
      module_d.py 

我可以导入mypackage.module_amypackage.mysubpacakge.module_c等。

您也可以通过将代码放入__init__.py中,将函数添加到mypackage(如您提到的numpy函数)。虽然这通常被认为是丑陋的。

如果你看看numpy's __init__.py,你会看到很多代码 - 其中很多是定义这些顶级类和函数。 __init__.py代码是加载包时首先执行的代码。

+0

那么它是如何导入类似numpy或scipy的库,并且包含类/函数(如模块)和其他模块(如包)。 所以我可以做numpy.array(一个类)或numpy.testing.assert ...(获取一个模块)。 – ImpGuard

+0

我刚刚回答说,它都在'__init __。py'中。当解释器加载该包时,其中的任何函数都会有该包的头等成员。 –

+0

啊,这就是我想知道的。我认为这会被认为是丑陋的,因为很多杂项。逻辑会进去。我认为所有的东西都是单独编码的,不知何故合并成__init__.py之后? 有这样的东西似乎相当有用,但我不知道如何复制它,而不只是在一个文件中转储大量的代码。 – ImpGuard