Skip to content

Commit b45d8b9

Browse files
committed
docs 📝 模块和包
一. 模块 1.1. 导入模块 1.1.1 导入模块的方式 1.1.2 导入方式详解 1.1.2.1 import 1.1.2.2 from..import.. 1.1.2.3 from .. import * 1.1.2.4 as定义别名 1.2. 制作模块 1.2.1 定义模块 1.2.2 测试模块 1.2.3 调用模块 1.2.4 注意事项 1.3. 模块定位顺序 1.4. __all__ 二. 包 2.1 制作包 2.1.1 快速体验 2.2 导入包 2.2.1 方法一 2.2.1.1 体验 2.2.2 方法二 2.2.2.1 体验 三. 总结
1 parent 6a517b3 commit b45d8b9

File tree

1 file changed

+344
-0
lines changed

1 file changed

+344
-0
lines changed

doc/02-模块_包.md

Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,344 @@
1+
# 模块和包
2+
3+
- [一. 模块](#一-模块)
4+
- [1.1. 导入模块](#11-导入模块)
5+
- [1.1.1 导入模块的方式](#111-导入模块的方式)
6+
- [1.1.2 导入方式详解](#112-导入方式详解)
7+
- [1.1.2.1 import](#1121-import)
8+
- [1.1.2.2 from..import..](#1122-fromimport)
9+
- [1.1.2.3 from .. import \*](#1123-from--import-)
10+
- [1.1.2.4 as定义别名](#1124-as定义别名)
11+
- [1.2. 制作模块](#12-制作模块)
12+
- [1.2.1 定义模块](#121-定义模块)
13+
- [1.2.2 测试模块](#122-测试模块)
14+
- [1.2.3 调用模块](#123-调用模块)
15+
- [1.2.4 注意事项](#124-注意事项)
16+
- [1.3. 模块定位顺序](#13-模块定位顺序)
17+
- [1.4. `__all__`](#14-__all__)
18+
- [二. 包](#二-包)
19+
- [2.1 制作包](#21-制作包)
20+
- [2.1.1 快速体验](#211-快速体验)
21+
- [2.2 导入包](#22-导入包)
22+
- [2.2.1 方法一](#221-方法一)
23+
- [2.2.1.1 体验](#2211-体验)
24+
- [2.2.2 方法二](#222-方法二)
25+
- [2.2.2.1 体验](#2221-体验)
26+
- [三. 总结](#三-总结)
27+
28+
29+
# 一. 模块
30+
31+
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
32+
33+
模块能定义函数,类和变量,模块里也能包含可执行的代码。
34+
35+
## 1.1. 导入模块
36+
37+
### 1.1.1 导入模块的方式
38+
39+
- import 模块名
40+
- from 模块名 import 功能名
41+
- from 模块名 import *
42+
- import 模块名 as 别名
43+
- from 模块名 import 功能名 as 别名
44+
45+
### 1.1.2 导入方式详解
46+
47+
#### 1.1.2.1 import
48+
49+
- 语法
50+
51+
``` python
52+
# 1. 导入模块
53+
import 模块名
54+
import 模块名1, 模块名2...
55+
56+
# 2. 调用功能
57+
模块名.功能名()
58+
```
59+
60+
- 体验
61+
62+
``` python
63+
import math
64+
print(math.sqrt(9)) # 3.0
65+
```
66+
67+
#### 1.1.2.2 from..import..
68+
69+
- 语法
70+
71+
``` python
72+
from 模块名 import 功能1, 功能2, 功能3...
73+
```
74+
75+
- 体验
76+
77+
``` python
78+
from math import sqrt
79+
print(sqrt(9))
80+
```
81+
82+
83+
84+
#### 1.1.2.3 from .. import *
85+
86+
- 语法
87+
88+
``` python
89+
from 模块名 import *
90+
```
91+
92+
- 体验
93+
94+
``` python
95+
from math import *
96+
print(sqrt(9))
97+
```
98+
99+
#### 1.1.2.4 as定义别名
100+
101+
- 语法
102+
103+
``` python
104+
# 模块定义别名
105+
import 模块名 as 别名
106+
107+
# 功能定义别名
108+
from 模块名 import 功能 as 别名
109+
```
110+
111+
- 体验
112+
113+
``` python
114+
# 模块别名
115+
import time as tt
116+
117+
tt.sleep(2)
118+
print('hello')
119+
120+
# 功能别名
121+
from time import sleep as sl
122+
sl(2)
123+
print('hello')
124+
```
125+
126+
127+
128+
## 1.2. 制作模块
129+
130+
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。**也就是说自定义模块名必须要符合标识符命名规则。**
131+
132+
### 1.2.1 定义模块
133+
134+
新建一个Python文件,命名为`my_module1.py`,并定义`testA`函数。
135+
136+
``` python
137+
def testA(a, b):
138+
print(a + b)
139+
```
140+
141+
142+
143+
### 1.2.2 测试模块
144+
145+
在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息.,例如,在`my_module1.py`文件中添加测试代码。
146+
147+
``` python
148+
def testA(a, b):
149+
print(a + b)
150+
151+
152+
testA(1, 1)
153+
```
154+
155+
此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行`testA`函数的调用。
156+
157+
解决办法如下:
158+
159+
``` python
160+
def testA(a, b):
161+
print(a + b)
162+
163+
# 只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行testA函数调用
164+
if __name__ == '__main__':
165+
testA(1, 1)
166+
```
167+
168+
169+
170+
### 1.2.3 调用模块
171+
172+
```python
173+
import my_module1
174+
my_module1.testA(1, 1)
175+
```
176+
177+
178+
179+
### 1.2.4 注意事项
180+
181+
如果使用`from .. import ..``from .. import *`导入多个模块的时候,且模块内有同名功能。当调用这个同名功能的时候,调用到的是后面导入的模块的功能。
182+
183+
- 体验
184+
185+
``` python
186+
# 模块1代码
187+
def my_test(a, b):
188+
print(a + b)
189+
190+
# 模块2代码
191+
def my_test(a, b):
192+
print(a - b)
193+
194+
# 导入模块和调用功能代码
195+
from my_module1 import my_test
196+
from my_module2 import my_test
197+
198+
# my_test函数是模块2中的函数
199+
my_test(1, 1)
200+
```
201+
202+
203+
204+
## 1.3. 模块定位顺序
205+
206+
当导入一个模块,Python解析器对模块位置的搜索顺序是:
207+
208+
1. 当前目录
209+
2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
210+
3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
211+
212+
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
213+
214+
- 注意
215+
- 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
216+
- `使用from 模块名 import 功能`的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
217+
218+
219+
220+
## 1.4. `__all__`
221+
222+
如果一个模块文件中有`__all__`变量,当使用`from xxx import *`导入时,只能导入这个列表中的元素。
223+
224+
- my_module1模块代码
225+
226+
``` python
227+
__all__ = ['testA']
228+
229+
230+
def testA():
231+
print('testA')
232+
233+
234+
def testB():
235+
print('testB')
236+
```
237+
238+
- 导入模块的文件代码
239+
240+
``` python
241+
from my_module1 import *
242+
testA()
243+
testB()
244+
```
245+
246+
247+
248+
# 二. 包
249+
250+
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为`__init__.py` 文件,那么这个文件夹就称之为包。
251+
252+
## 2.1 制作包
253+
254+
[New][Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。
255+
256+
注意:新建包后,包内部会自动创建`__init__.py`文件,这个文件控制着包的导入行为。
257+
258+
### 2.1.1 快速体验
259+
260+
1. 新建包`mypackage`
261+
2. 新建包内模块:`my_module1``my_module2`
262+
3. 模块内代码如下
263+
264+
``` python
265+
# my_module1
266+
print(1)
267+
268+
269+
def info_print1():
270+
print('my_module1')
271+
```
272+
273+
``` python
274+
# my_module2
275+
print(2)
276+
277+
278+
def info_print2():
279+
print('my_module2')
280+
```
281+
282+
283+
284+
## 2.2 导入包
285+
286+
### 2.2.1 方法一
287+
288+
``` python
289+
import 包名.模块名
290+
291+
包名.模块名.目标
292+
```
293+
294+
#### 2.2.1.1 体验
295+
296+
``` python
297+
import my_package.my_module1
298+
299+
my_package.my_module1.info_print1()
300+
```
301+
302+
### 2.2.2 方法二
303+
304+
注意:必须在`__init__.py`文件中添加`__all__ = []`,控制允许导入的模块列表。
305+
306+
``` python
307+
from 包名 import *
308+
模块名.目标
309+
```
310+
311+
#### 2.2.2.1 体验
312+
313+
``` python
314+
from my_package import *
315+
316+
my_module1.info_print1()
317+
```
318+
319+
320+
321+
# 三. 总结
322+
323+
- 导入模块方法
324+
325+
``` python
326+
import 模块名
327+
328+
from 模块名 import 目标
329+
330+
from 模块名 import *
331+
```
332+
333+
- 导入包
334+
335+
``` python
336+
import 包名.模块名
337+
338+
from 包名 import *
339+
```
340+
341+
- `__all__ = []` :允许导入的模块或功能列表
342+
343+
344+

0 commit comments

Comments
 (0)