7.2 包(package)
包是一个有层次的文件目录结构, 包含多个模块或子包
目录下有一个 特殊的文件 __init__.py
包名的 命名方式 和变量名一致,由字母、下划线组成
当项目较大,模块较多时,我们就可以把模块放在包中,便于管理。
Python包的导入
包本质上还是模块,因此导入模块的语法同样也适用于导入包,导入方法可归结为以下3种:
(1)import 包名[.模块名 [as 别名]]
(2)from 包名 import 模块名 [as 别名]
(3)from 包名.模块名 import 成员名 [as 别名]
用 [] 括起来的,是可选部分
注意,导入包的同时,会在包目录下生成一个含有__init__.cpython-36.pyc文件的 __pycache__ 文件夹。
import 包名[.模块名 [as 别名]]
以之前创建好的demoTest包为例,导入demoA模块,并使用该模块中成员
可以看到,通过此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加"包名.模块名"为前缀。
如果使用as给"包名.模块名"起一个别名的话,可直接用这个别名作为前缀使用该模块中的方法
当直接导入指定包时,程序会自动执行该包所对应文件夹下的__init__.py文件中的代码
直接导入包名,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的__init__.py文件,因此,运行该程序,在执行__init__.py文件中代码的同时,还会抛出 AttributeError 异常(访问的对象不存在):
我们知道,包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module的变量,导入包也是如此:
import my_package
print(my_package)
print(type(my_package))
运行结果为:
<module 'demoTest' from 'E:\\testGit\\demoTest\\__init__.py'>
<class 'module'>
from 包名 import 模块名 [as 别名]
仍然以导入demoTest 包中的demoA模块为例,使用此语法格式实现,代码如下:
可以看到,使用此语法格式导入包中模块后,在使用其成员时不需要带包名前缀,但需要带模块名作为前缀。
当然,我们也可以使用as为导入的模块定义别名,例如:
既然包也是模块,那么这种语法格式自然也支持 from 包名 import * 这种写法,它和"import 包名"的作用一样,都只是将该包的 __init__.py 文件导入并执行。
from 包名.模块名 import 成员名 [as 别名]
用于导入“包.模块”中指定的成员(变量、函数或类),通过该方式导入的成员,可直接使用变量名调用
当然,也可以使用 as 为导入的成员起一个别名
另外,可以使用 * 代替成员名,表示导入该模块下的所有成员