119 lines
3.9 KiB
Markdown
119 lines
3.9 KiB
Markdown
# python3小白课:自己写模块
|
||
|
||
### 模块定义
|
||
|
||
要自己写一个模块,语法也非常非常简单,其实模块就是一个自己写的python脚本文件!你可以在一个py文件中定义变量、函数、类等等内容,保存起来,就是一个模块了。模块的名字就是这个py文件的文件名!
|
||
|
||
因此这节课我们来学习定义一个简单的自己的模块吧!
|
||
|
||
定义模块练习我们就定义一个简单的函数吧,将下面的代码保存成`mymodule.py`文件吧:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
|
||
def add_1(num):
|
||
return num + 1
|
||
```
|
||
|
||
这样我们就定义好了一个最简单的模块,里面的函数就是其中一个成员,我们可以在别的py文件中导入并使用,将你的模块文件跟你的测试py文件放在同一个目录下即可。
|
||
|
||
---
|
||
|
||
### 模块的说明文档
|
||
|
||
除了可以给函数添加说明文档,你还可以给模块添加说明文档。在所有可执行的代码前面使用长文本字符串定义说明文档即可,我们在刚才的文件前面补充一下:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
|
||
"""
|
||
模块名:mymodule
|
||
小白同学的第一个模块
|
||
这是说明文档
|
||
命令:add_1(num)
|
||
将传入的数字加上1后返回
|
||
"""
|
||
|
||
def add_1(num):
|
||
"""将传入的数字加上1后返回,这是函数的文档"""
|
||
return num + 1
|
||
```
|
||
|
||
编写完成后,我们可以在其他地方导入该模块,使用`help`命令即可查看模块帮助文档,也可以访问模块的`__doc__`属性。
|
||
|
||
比如我们再在`同一个目录下`定义一个`test.py`文件:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
import mymodule
|
||
|
||
help(mymodule)
|
||
print("*" * 40)
|
||
print(mymodule.__doc__)
|
||
|
||
print(mymodule.add_1(1))
|
||
```
|
||
|
||
我们还顺便测试了一下里面定义的函数。
|
||
|
||
> [!tip]
|
||
>
|
||
> 成功运行后,我们可以发现在模块所在目录下看到一个名为`__pycache__`的文件夹,里面会为模块生成一个`.pyc`文件,这是python为模块编译生成的字节码文件,是用来提升模块运行效率的,你知道并忽略它即可,将模块复制走的时候无需带上它。
|
||
|
||
---
|
||
|
||
### 模块的测试代码
|
||
|
||
> [!question]
|
||
>
|
||
> 模块写好之后,只能通过外部导入模块来进行测试吗?
|
||
|
||
非也,别忘了模块本身也是一个python脚本文件,它自己也能跑起来。我们可以自行在模块的文件中定义一些函数或者执行语句来测试我们编写的模块,但如果写的是执行语句的话,这些语句会在导入模块时运行一遍。但我们在使用时,是不希望执行测试代码的。
|
||
|
||
别急,python中有一种不错的机制可以满足你的需求。
|
||
|
||
> [!tip]
|
||
>
|
||
> python模块有一个内置的变量`__name__`,如果直接执行模块的代码,这个变量的值就为`__main__`,但如果是通过外部导入模块的方式,这个变量的值为模块的名字。
|
||
|
||
利用这个机制,我们可以在模块的结尾编写流程控制来区分是导入模块还是直接执行,看下如下模块代码:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
|
||
"""
|
||
模块名:mymodule
|
||
小白同学的第一个模块
|
||
这是说明文档
|
||
命令:add_1(num)
|
||
将传入的数字加上1后返回
|
||
"""
|
||
|
||
def add_1(num):
|
||
"""将传入的数字加上1后返回,这是函数的文档"""
|
||
return num + 1
|
||
|
||
|
||
if __name__ == '__main__':
|
||
print("这是在测试模块")
|
||
help(__name__)
|
||
print("*" * 40)
|
||
print(__doc__)
|
||
print(add_1(100))
|
||
```
|
||
|
||
这样,如果是直接运行这段代码,就会运行17~21行的部分代码了,但如果是导入模块的话,这部分代码就不会被执行。
|
||
|
||
> [!tip]
|
||
>
|
||
> `if __name__ == '__main__':`这种写法,在你的一个普通的py脚本文件中也可以这么用的,不一定是在模块中才能用。
|
||
|
||
|
||
|
||
### 单词释义
|
||
|
||
| 单词 | 释义 |
|
||
| -------- | ---------------------------------- |
|
||
| mymodule | my我的,module模块,我的模块的意思 |
|
||
| name | 名字 |
|
||
| main | 主要的 | |