2018.10.12python学习第十八天

什么是包?(what)

Packages are a way of structuring Python’s module namespace by using “dotted module names”
译:包是通过一种使用‘.模块名’来组织python模块的namespace的方式

通俗讲:就是包含有__init__.py文件的文件夹

需要强调的是:
1.在python3中,即使包下面没有__init__.py文件,import包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包 报错
2.创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包的本质就是模块

为何要用包?(why) 包的本质就是一个文件夹,那么文件夹的功能就是讲文件打包起来 随着功能越写越多,我们无法将所有的功能都放到一个文件中,于是我们使用模块取组织功能,而随着模块越来越多,我们就需要用我呢见家将模块组织起来,依次来提高程序的结构性和可维护性

注意事项:

1.关于包相关的导入语句也分为import和from xxx  import xxx 两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
a.凡是在导入时带点的,点的左边都必须是一个包,否则非法(报错)。可以带有一连串的点,如item.subitem.subsubitem,但是都必须遵从这个原则。但是对于导入后,在使用时就没有这种限制了,点的左边可以时包,模块,函数,类(他们都可以用点的方式调用自己的属性)

b.import导入文件时,产生的namespace来源于文件, import 包,产生的namespace同样来源于文件,即包下的__init__.py文件,导入包的本质就是在导入该文件

3.包A和包B下有同名模块也不会冲突,如A.a和B.b来自两个命名空间

包的使用:

1.import packagename
单独导入包名称时,不会导入包中国所有包含的所有子模块,
2.from xxx  import xxxx
注意:from后import导入的模块,必须是一个明确的不能带点,否则有语法错误。
如:from a import b,c是错误的语法
3.from a.b import*
此处有两种可能,如果b是一个子包的话,那么*是表示b包中,__init__.py文件中所有的name
如果b是一个模块的话,那么*就是该模块下所有的name
注意from a import b的用法
如果a是一个模块,那么b不能是模块,要不然就会非法
如果a是一个包,那么b必须是一个明确的不能带点的(参考上面第2点)
绝对导入:
从sys.path开始找文件的完整路径称之为绝地导入(from a.b import fun1 #就是从a文件夹中,找b文件夹,然后再b文件夹中找到fun1这个模块导入到目前的文件中(即输入这行字的文件)
相对导入:
from . .fun1 import *(一个点表示同层级,两个点表示上一层级,# 就是从上一层级的fun1模块中,导入该模块的全部name) 在内部文件中导入外部的模块功能
top-lvevl package:
包/子包所包含的模块都是用来被导入的,而不是被执行的。所环境变量都是以执行文件为准,,所以当我们在用相对导入导入外部模块功能的时候,我们的外部模块的层级不能超过执行文件的层级。

绝对导入和相对导入的总结

绝对导入:
以执行文件的sys.path为起点开始导入,称之为绝对导入
优点:执行文件与被导入的模块中都可以使用
缺点:所有的导入都是以sys.path为起点,导入麻烦
相对导入:
参照当前所在文件的文件夹为起始开始查找,称之为相对导入
符号:.代表当前所在文件的文件夹,..代表上一级文件夹,...代表上一级的上一级文件夹
优点:导入更加方便
缺点:只能在导入包中的模块时才能使用
注意:
1.相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内
2.attempted relative import byound top-level package
3.不应该超出顶级包

 

posted on 2018-10-13 10:10  撩与诗人  阅读(148)  评论(0编辑  收藏  举报