欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!
前言
在 Python 中,模块是组织代码的重要结构。通过模块,程序员可以更高效地管理大型项目,降低代码的复杂度,提高代码的可读性和可维护性。本文详细讲解了模块的导入方式以及自定义模块的使用。
本篇文章参考:黑马程序员
一、模块的导入
1.什么是模块?
Python 模块(Module)是一个 Python 文件,以.py
结尾。模块可以包含函数、类和变量以及可执行的代码。
通过导入模块,我们能够使用模块中定义的各种功能,简化开发流程,并提升代码的可读性和可维护性。Python标准库中包含了众多的模块,为开发者提供了广泛的功能支持,而自定义模块则允许开发者根据需求构建特定功能。
我们可以认为一个模块就是一个工具包, 每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能。
如何查看模块源码?
按住Ctrl键并点击time这个名称,可直接查看 time.py 的源代码
按住Ctrl键+f 即可打开一个搜索栏,在搜索栏输入想要查找的函数或类的名并回车,便可快速定位到该函数或类的定义
2.模块的导入方式
模块导入的基本语法:
[from 模块名] import [模块|类|变量|函数|*] [as 别名]
常用的组合形式如下:
- import 模块名
- from 模块名 import 类、变量、方法等
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
注意:
- 使用 import 导入,调用模块中的函数时需使用
模块名.函数名
的形式 - 使用 from … import 导入时可以直接调用函数
- 使用 as 起别名,调用模块中的函数时需使用
别名.函数名
的形式
①import 模块名
# 使用import导入time模块使用sleep函数
# 按住Ctrl键并点击time这个名称,可直接查看 time.py 的源代码
import time # 导入Python内置的time模块(即time.py这个代码文件)
print("你好!")
# 睡眠5s
# .用于确定层级关系
# 访问 time 模块中的 sleep 函数
time.sleep(5) #通过.即可使用模块内的全部功能(类、函数、变量)
print("Hello!")
运行等待5s后,输出结果:
你好!
Hello!
使用 import time 导入整个 time 模块。调用模块中的函数(如 sleep),需使用模块名.函数名
的形式。
注意事项:
在Python中.
符号用于访问对象的属性或方法。当我们导入一个模块后,模块名便成为一个对象,我们可通过.
来访问该对象的属性和方法,明确地指明使用的功能。
②from 模块名 import 类、变量、方法等
# 使用from导入time的sleep功能
from time import sleep
print("你好")
sleep(5)
print("Hello!")
运行等待5s后,输出结果:
你好!
Hello!
使用 from time import sleep,只导入了 time 模块中的 sleep 函数,可直接使用 sleep(5),而不需要前缀 time。
③from 模块名 import *
# 使用*导入time模块的全部功能
from time import * # *号表示全部
print("你好")
sleep(5)
print("Hello!")
运行等待5s后,输出结果:
你好!
Hello!
使用 from time import * 导入 time 模块中的所有功能,可直接使用模块中的所有函数和变量,而不需要前缀。
④import 模块名 as 别名
# 使用as给特定模块加上别名
import time as t # *号表示全部
print("你好")
t.sleep(5)
print("Hello!")
运行等待5s后,输出结果:
你好!
Hello!
使用 import time as t,将 time 模块重命名为 t。调用时需要使用 t.sleep(5)。这种方式可以简化代码,尤其是当模块名较长时。
⑤from 模块名 import 功能名 as 别名
# 使用as给特定功能加上别名
from time import sleep as sl # *号表示全部
print("你好")
sl(5)
print("Hello!")
运行等待5s后,输出结果:
你好!
Hello!
使用 from time import sleep as sl,将 sleep 函数重命名为 sl,可更简洁地调用这个函数。
二、自定义模块
Python中虽然内置了许多实用的模块,但有时我们需要根据特定需求创建个性化的模块。这就可以通过自定义模块来实现,也就是自己编写一个模块。
注意:
每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说自定义模块名必须要符合标识符命名规则。
①导入自定义模块
在Pycharm中新建一个名为my_module1的python文件,并定义test函数。
②导入不同模块的同名功能
在 Python 中导入多个模块时,如果模块内有同名的功能,那么调用这个同名功能的时候,后导入的会覆盖先导入的。
③if __name__ == '__main__':
结构
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,开发人员通常会在.py文件中添加一些测试信息,例如,在my_module1.py文件中添加测试代码test(1,2)
def test(a,b):
print(a+b)
test(1,2)
输出结果:
3
问题:
在模块中添加测试代码后,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行test
函数的调用。
from my_module1 import test
输出结果:
3
解决方案:
使用if __name__ == '__main__':
判断模块是否直接运行。
每个 Python 模块都有一个内置的属性 __name__
,这个属性的值根据模块的使用方式而不同。
- 直接运行模块:
如果 Python 解释器直接运行该文件,__name__
的值为'__main__'
,__name__ == '__main__'
为真,紧随其后的代码会被执行 - 导入模块:
如果该文件被另一个模块导入,__name__
的值则是这个模块的名称,'__main__'
,__name__ == '__main__'
为假,紧随其后的代码不会被执行。
def test(a,b):
print(a+b)
if __name__ == '__main__':
test(1,2)
输出结果:
3
from my_module1 import test
输出结果为空
④ __all__
变量
__all__
是一个列表,定义了从模块中使用 from module import * 导入的名称。列表中包含的名称会被导入,而未在列表中列出的名称不会被导入。
如果一个模块文件中有__all__
变量,当使用from xxx import *
导入时,只能导入这个列表中的元素
这种机制有助于封装模块的接口,确保用户只能访问特定的功能,增强模块的安全性和可维护性。