模块
概述
模块是Python中一个包含Python代码的文件,通常以.py
为扩展名。模块可以包含函数、类和变量,也可以包含可执行的代码。模块的主要作用是组织和封装代码,以便于重用和维护。
导入模块的5种方式
import 模块名
- 导入模块下所有的功能(函数、类等),但必须通过
模块名.功能名()
的方式来调用。
- 导入模块下所有的功能(函数、类等),但必须通过
import 模块名 as 别名
- 导入模块下所有内容,并为模块指定一个别名,通过
别名.功能名()
的方式调用。
- 导入模块下所有内容,并为模块指定一个别名,通过
from 模块名 import 功能名
- 导入模块中的指定功能,之后可以直接通过
功能名()
的方式调用。
- 导入模块中的指定功能,之后可以直接通过
from 模块名 import 功能名 as 别名
- 导入模块中的指定功能,并为该功能指定一个别名,之后通过
别名()
的方式调用。
- 导入模块中的指定功能,并为该功能指定一个别名,之后通过
from 模块名 import *
- 导入模块中所有的公共功能(即不以单下划线
_
开头的名称),之后可以直接通过功能名调用。但这种方式通常不推荐,因为它可能导致命名冲突。
- 导入模块中所有的公共功能(即不以单下划线
使用自定义模块
概述
自定义模块就是你自己编写的.py
文件,其中包含了类、变量、函数等。
导包方式
与导入标准库模块或第三方库模块的方式相同,可以使用上述的五种方式之一。
细节
-
命名冲突:如果同时导入了两个模块,且它们有重名的功能,则后导入的功能会覆盖先导入的功能(在相同的命名空间中)。
-
__name__
属性- 特点:
- 在当前模块中打印
__name__
时,其值为'__main__'
,表示该模块是被直接运行的。 - 在其他模块中导入该模块时,
__name__
的值为被导入的模块名。
- 在当前模块中打印
- 应用场景:常用于编写即可作为脚本直接运行,又可被其他模块导入的代码。通过检查
__name__
的值,可以决定是否执行某些只在模块被直接运行时才应该执行的代码。
- 特点:
-
__all__
属性- 特点:
- 只对
from 模块名 import *
这种导入方式有效。 - 如果不设置
__all__
,则默认导入模块中定义的所有公共名称(即不以单下划线_
开头的名称)。 - 如果设置了
__all__
,则只导入__all__
列表中指定的名称。
- 只对
- 应用场景:当模块中包含大量功能,但通常只需要导入其中一部分时,可以使用
__all__
来限制导入的内容。
- 特点:
包
概述
包(Package)是一个包含__init__.py
文件的目录(在Python 3.3及以后的版本中,空的__init__.py
文件不再是必需的,但保留它可以提高兼容性)。包可以包含模块和子包,用于组织和封装相关的模块。
关系
包 > 模块 > 类、变量、函数
细节
-
大白话翻译:包 = 文件夹 +
__init__.py
(尽管在Python 3.3及以后版本,__init__.py
可以省略)。 -
组织模块:可以将功能相似的模块(例如,都是操作文件系统的,或者都是进行数学计算的)放在同一个包中,以便于集中管理和维护。
-
包的导入
- 包的本质可以看作是特殊的模块,也可以像模块一样被导入和使用。
- 导入包时,Python会在指定的目录(如当前目录、PYTHONPATH环境变量指定的目录等)中查找包含
__init__.py
的目录。
导包的两种方式
import 包名.模块名
- 导入包下的某个模块,之后需要通过
包名.模块名.功能名()
的方式来调用该模块中的功能。
- 导入包下的某个模块,之后需要通过
from 包名 import 模块名
- 导入包下的指定模块,之后可以直接通过
模块名.功能名()
的方式来调用该模块中的功能。
- 导入包下的指定模块,之后可以直接通过
__init__.py
中的__all__
属性
-
默认:如果不设置
__all__
,则from 包名 import *
不会导入包中的任何内容(除了__init__.py
中明确定义的)。 -
指定:在
__init__.py
中设置__all__
,可以指定from 包名 import *
时应该导入哪些模块或子包。这对于控制包的导出内容非常有用,可以避免不必要的导入和潜在的命名冲突。