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

93 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# python3小白课包成员导入
### 包成员导入的一般方法
这部分讲的方法比较适用于在`__init__.py`文件中未做其他操作或者该文件为空的场景。
我们就拿上节课讲到的定义的`xiaobai`这个包来说起。
我们再回顾一下这几个文件的内容:
`module1.py`文件:
```python
# coding:utf-8
"""
我是module1
"""
NAME = "小白"
AGE = 18
```
`module2.py`文件:
```python
# coding:utf-8
"""
我是module2
"""
def add_1(num):
return num + 1
```
基于上述内容我们有如下一些说明的导入用例,用于写在`test.py`文件中(它不是一个可用用例,只是为了解释说明一些导入的方法):
```python
# 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`文件,所以包内的子模块的成员,我们可以在这个文件中编写导入。
我们说一下常见的两种写法的区别(下述不是真正可用的文件代码):
```python
# 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`文件的内容如下:
```python
# coding:utf-8
from .module1 import *
from .module2 import *
```
然后可以在`test.py`文件中这样写来方便调用:
```python
# coding:utf-8
import xiaobai
print(xiaobai.NAME, xiaobai.AGE)
print(xiaobai.add_1(100))
```
这样可以实现在包中方便管理代码,在外部调用时也调用方便。
> [!tip]
>
> 上述写法比较适用于多个子模块之间没有重名的情况,如果有重名的情况,可能会存在某些成员被覆盖等问题,具体你可以自行测试一下。起名时尽量不要重名,如果非要重名,可以使用之前讲过的导入子模块的方式,而不在初始化文件中做导入。