1.Python包的结构
包(package)是python模块文件(module)所在的目录,且该目录下必须存在__init__.py文件,然后存放若干的模块文件和子目录,假如子目录中也有 __init__.py ,那么这个子目录就是这个包的子包了。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__值在下面的内容中还会提到。
一个包里面可以有若干个模块。模块在Python中对应于一个.py文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可使用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。
常见的包结构如下:
package_a
├── __init__.py
├── module_1.py
├── module_2.py
├── subpackage_a
├── __init__.py
└── s_module_1.py
└── subpackage_b
2.导入(import)
包的导入
import package #as alias 可命名别称,下同
import package.subpackage #as alias
模块的导入
import package.moudule #as alias
import package.subpackage.moudule #as alias
使用时必须用全路径名。
from package import *
from package.subpackage import *
全部导出包中定义过的模块。 如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
from package.subpackage import module
from package.subpackage import module as alias
这样导入,在使用的时候可以直接使用模块名而不用加上包前缀。
另外,dir()可以查看模块定义了什么名字(包括变量名,模块名,函数名等)
函数或变量的导入
from module import item # as alias
from package.subPackage.module import item # as alias
这样可以直接从模块中导入名字到符号表,但模块名字不会被导入。
from module import *
这样可以把模块中的所有名字全部导入,除了那些以下划线开头的名字符号。不建议使用,不清楚导入了什么符号,有可能覆盖自己定义的东西。
3.总结
1. 当使用from package import name时,name可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)。首先检查name是否定义在包中,如果没找到,就认为name是一个模块并尝试加载它,失败时会抛出一个ImportError异常。
2. 当使用import name.subname.subsubname语法时,倒数第二个name(在此处为subname)必须是包,最后一个name(在此处为subsubname)可以是一个模块或包,但不可以是类、函数和变量。