模块是一个包含了Python定义和语句的文件,可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块,模块可以包含变量、函数、类或可执行代码。通过使用模块,我们可以将代码分离成逻辑单元,促进模块化编程。所以我们可以简单的理解为,一个py文件就是一个模块,大部分情况都是这样的。
在Python中,要想使用Python模块,我们必须要将模块导入,这里可以使用import
关键字。
import module_name
这种方式会导入整个模块,你可以使用module_name
来访问其中的函数、变量和类。例如,要导入math模块:
import math
result = math.sqrt(16)
print(result) # 输出:4.0
from module_name import object_name
这种方式会导入指定的函数、变量或类,你可以直接使用该对象而不需要加上模块名。例如,要仅导入math模块中的sqrt函数:
from math import sqrt
result = sqrt(16)
print(result) # 输出:4.0
import module_name as alias_name
这种方式可以给导入的模块指定一个别名,方便使用。例如,要将datetime模块导入并命名为dt:
import datetime as dt
now = dt.datetime.now()
print(now) # 输出当前的日期和时间
此外,还可以使用from module_name import *
的形式导入模块中的所有对象。但是不推荐这种方式,因为它会导入模块中的所有对象,可能造成命名冲突或意外的行为。最好的做法是显式导入需要使用的对象。
需要注意的是,Python会按照一定的搜索路径来查找模块,其中包括当前目录、Python标准库的安装目录以及其他已添加的路径。如果要导入自定义的模块或第三方模块,需要将其所在的路径添加到系统的搜索路径中。
比如当前目录中有个math.py文件,自己的文件是main.py
my_project/
├── main.py
└── math.py
math.py的文件内容
print("this is math module")
main.py的文件内容
import math
# 使用math模块中的函数和常量
result = math.sqrt(25)
print(result)
按正常来说,这个应该输出5的,当时如果你运行main.py会发现,发生了异常。
# python main.py
this is math module
Traceback (most recent call last):
File "/root/main.py", line 4, in
result = math.sqrt(25)
AttributeError: module 'math' has no attribute 'sqrt'
这是因为导入模块的时候,最先是在当前目录下查找,如果找到了,就直接用当前目录的模块,上面main.py中导入了math模块,而当前目录下刚好有一个math.py,所以就被导入了,但是这个文件中又没有sqrt方法,所以就报错了。所以在导入模块的时候一定要注意这种情况。
__all__
特殊用法前面我们说到了,from module_name import *
的形式会导入模块中的所有对象,但是通过加入__all__
变量的方式可以方便的选择导入的对象。
__all__
是一个特殊的变量,用于定义模块的公共接口。在Python中,可以在模块中定义__all__
变量,并将其设置为一个包含模块中所有公共对象名称的列表。这样当使用from module import *
语句导入模块时,只有__all__
列表中列出的对象才会被导入,而其他未列出的对象将不会被导入。
# mymodule.py
__all__ = ['func1', 'func2']
def func1():
pass
def func2():
pass
def _private_func():
pass
mymodule.py
模块定义了两个公共函数func1()
和func2()
以及一个私有函数_private_func()
。通过将__all__
设置为只包含func1()
和func2()
的列表,只能从该模块中导入这两个函数,而不能导入其他函数或变量。
使用示例:
from mymodule import *
print(func1()) # 输出:
print(func2()) # 输出:
print(_private_func) # 报错:NameError: name '_private_func' is not defined
我们使用from mymodule import *
语句导入了mymodule
模块中的所有公共对象。可以看到,只有func1()
和func2()
被成功导入,而私有函数_private_func()
没有被导入。如果尝试访问未导入的私有函数,将会引发NameError
异常。
所谓第三方模块就是非python标准库的包,使用的时候需要通过pip的方式来安装,安装完之后使用方法和上面的完全一样。
更多精彩内容,请关注同名公众:一点sir(alittle-sir)