Loading

Python之包的相关

包的产生:

  • 由于模块不断更新,越写越大,仅用单个py文件会使模块逻辑不够清晰,所以需要将模块的不同功能放入不同的py文件,然后将所有py文件放在一个目录内,这个目录就是包
  • 包就是一个包含用__init__.py文件的目录

包的使用:

  • 包的本质是模块的一种形式,包是用来被当做模块导入,而不是用来直接运行
  • 导入包本质是导入包内的__init__.py文件
import package

# Python2导入包,若包里没有__init__.py文件会报错
# Python3导入包,若包里没有__init__.py文件不会报错

包的导入:

  • 首先有如下文件结构
'''
test_dir/
	-pkg1
		-__init__.py
		-p1_m1.py
			-f1()
		-p1_m2.py
			-f2()
	-pkg2
		-__init__.py
		-p2_m1.py
			-f3()
		-p2_m2.py
			-f4()
	-demo.py
	
'''
  • 在demo.py内使用函数f1
  • 方式一:

import pkg1.p1_m1
pkg1.p1_m1.f1()

# 使用过于啰嗦,可以起别名
import pkg1.p1_m1 as m1
m1.f1()
  • 方式二:
# 直接从包内导入文件
from pkg1 import p1_m1
p1_m1.f1()

# 也可直接导入f1
from pkg1.p1_m1 import f1
f1()

注:对使用者来说,包的导入和单个模块的导入应该方式相同,若使用者导入包失败,应考虑包是否在sys.path列表中。

  • from ...impot 的from 后面可以带多个点. 点的左侧只能是包的名字。

  • from...import 的import后面只能接py文件或文件内的方法

    不能带点.

from pkg1 import p1_m1.f1
p1_m1.f1()
# 语法错误

若要让使用者对包的导入不会发生变化(当作单个模块导入),需要在包内的__init__.py文件内导入其他的模块

  • 绝对导入:

    • 以包作为顶级目录来导入

      # pkg1/__init__.py文件内
      from pkg1.p1_m1 import f1
      from pkg1.p1_m2 import f2
      from pkg2.p2_m1 import f3
      
    • 点的左侧必须是包

  • 相对导入

    • 仅限于包内使用,不能跨出包
    • . :表示当前目录
    • .. :表示上一级目录
# pkg1/__init__.py文件内
from .
注:包内之间的导入推荐使用相对导入
  • 在__init.py__内使用from ... import ... 导入包内的其他模块时,无法直接在init.py文件内运行,只能被其他文件用来导入

  • 在init.py文件内不能使用import p1_m1导入包内的其他文件,这样虽然可以直接在init.py文件内运行导入的模块,但当包被其他文件导入时,由于sys.path环境变量原因,包无法使用。

posted @ 2020-08-10 20:03  吃了好多肉  阅读(103)  评论(0编辑  收藏  举报