python3xiaobaike_2020/chapter6/6-6 python3小白课:包成员导入.md
2025-04-20 23:22:14 +08:00

3.1 KiB
Raw Permalink Blame History

python3小白课包成员导入

包成员导入的一般方法

这部分讲的方法比较适用于在__init__.py文件中未做其他操作或者该文件为空的场景。

我们就拿上节课讲到的定义的xiaobai这个包来说起。

我们再回顾一下这几个文件的内容:

module1.py文件:

# coding:utf-8
"""
我是module1
"""
NAME = "小白"
AGE = 18

module2.py文件:

# coding:utf-8
"""
我是module2
"""
def add_1(num):
    return num + 1

基于上述内容我们有如下一些说明的导入用例,用于写在test.py文件中(它不是一个可用用例,只是为了解释说明一些导入的方法):

# coding:utf-8
# 直接导入xiaobai包实际上就是导入__init__.py文件
import xiaobai
# 可以导入包中的子模块,如果未指定别名,使用时需要用导入的这么一长串来作为调用前缀
import xiaobai.module1
# 这种方式导入子模块,调用时前缀能稍微短一点
from xiaobai import module1
# 也可以导入某个模块的成员进来,可以不用前缀直接使用
from xiaobai.module2 import add_1

通过上述几个,相信你已经有了举一反三的能力,获取对应包的成员或对应包的导入也就不在话下了。我们注意到,这其中的关健就是.这个符号,这个符号能够进入更深的包层级,有了它,即使你有更深层级的子包定义也能顺利导入了。


通过__init__.py文件整合包成员

因为写导入包本身的本质就是会执行__init__.py文件,所以包内的子模块的成员,我们可以在这个文件中编写导入。

我们说一下常见的两种写法的区别(下述不是真正可用的文件代码):

# coding:utf-8
# .表示当前模块,这种写法的话相当于将模块导入包名中,调用时依然还是需要使用长长的方式调用
# 比如在__init__.py中这样写导入该文件不能直接自执行只能被导入否则会报错
from . import module1
# test.py中调用时要这样写
import xiaobai
print(xiaobai.module1.NAME)
# 上述写法很长我们可以写成这样在__init__.py文件中
from .module1 import *
# 这样在外部就可以用xiaobai前缀来调用module1的全部成员了在test.py中
import xiaobai
print(xiaobai.NAME)

基于前面讲的内容,我们这会儿来补充一下__init__.py文件的内容如下:

# coding:utf-8
from .module1 import *
from .module2 import *

然后可以在test.py文件中这样写来方便调用:

# coding:utf-8
import xiaobai
print(xiaobai.NAME, xiaobai.AGE)
print(xiaobai.add_1(100))

这样可以实现在包中方便管理代码,在外部调用时也调用方便。

Tip

上述写法比较适用于多个子模块之间没有重名的情况,如果有重名的情况,可能会存在某些成员被覆盖等问题,具体你可以自行测试一下。起名时尽量不要重名,如果非要重名,可以使用之前讲过的导入子模块的方式,而不在初始化文件中做导入。