Python自定义包

  • 包的唯一标识__init__.py
  • 查询包路径__path__
  • 包的层级结构
  • 通配导入__all__
  • 包的相对路径导入

包(package)是将一些模块组织在一起构成一个更大规模的模块,也是Python中对模块的更高一级的抽象。Python允许用户把目录当成模块看待,目录中不同模块文件,就变成了包里面的子模块。一个包可以由一个或多个模块或子包构成的模块,包目录下不但可以包含作为子模块的py文件,还可以包含子目录,这些子目录也可以是Python的包。

  • __init__.py文件的作用?

当一个文件夹中存在一个__init__.py文件时,这个文件夹就会被Python解释器识别为一个包。__init__.py除了标识一个文件夹是包的作用以外,它还可以执行一些初始化操作。在使用import导入一个模块的时候,__init__.py文件会首先被执行。因此__init__.py中可以写一些初始化的代码,比如导入其他依赖的Python模块。

  • 如何验证__init__.py是优先被导入的?

绝大部分时候让__init__.py文件空着就好。

  • 查询包路径__path__

__path__是一个包自带的隐藏属性,它描述一个包的完整路径,也是包的一个标识。

  • 包的层级结构

封装成包是很简单的。在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py文件。

chooseTask/
    __init__.py
    ui/
        __init__.py
        resource.py
    config/
        __init__.py
        user.py
        sg.py
    mainWin.py

有了上面的层级结构,你可以执行各种import语句

包的相对路径导入

Python自定义包的相对导入问题?

Python 2.x和3.x包导入的区别

相对导入对执行方式是有一定的要求,不同执行方式可能会报一种不是错误的错误

假设现在有一个myPackage的包

myPackage/
    __init__.py
    aaa/
        __init__.py
        spam.py
        grok.py
    bbb/
        __init__.py
        bar.py

如果模块myPackage.aaa.spam要导入同目录下的模块grok

# myPackage/aaa/spam.py
from . import grok

如果模块myPackage.aaa.spam要导入不同目录下的模块bbb.bar

# myPackage/aaa/spam.py
from ..bbb import bar
# -*- coding: utf-8 -*-
#!/usr/bin/python

"""
this is a doc string of test pack
"""

a = 1
b = 2

def foo():
    print("fool")