python组织结构
Python的组织结构主要包括模块(Modules)、包(Packages)和库(Libraries)。让我们逐一来了解它们的概念和用法。
1. 模块(Modules)
一个模块就是一个包含Python代码的文件。这个文件可以包含变量、函数、类等,它的目的是为了组织代码并使其可重用。你可以使用import
语句来引入一个模块,并使用其中的变量、函数或类。
# 例子:创建一个名为mymodule.py的模块
# mymodule.py
def greet(name):
print(f"Hello, {name}!")
# 在另一个文件中引入模块并使用其中的函数
# main.py
import mymodule
mymodule.greet("Alice")
2. 包(Packages)
包是一种用于组织模块的方式,它是一个包含了多个模块的目录。在包的目录中通常会包含一个特殊的__init__.py
文件,该文件可以为空,也可以包含包的初始化代码。通过使用点号(.
)来表示包的层级结构,你可以引入包中的模块。
# 例子:创建一个名为mypackage的包
# mypackage/__init__.py
# mypackage/module1.py
def func1():
print("Function 1")
# mypackage/module2.py
def func2():
print("Function 2")
# 在另一个文件中引入包和其中的模块
# main.py
from mypackage import module1, module2
module1.func1()
module2.func2()
_init_.py的用法
- 用来标识该文件夹是一个包。
- 导入包或包下的模块时,
__init__.py
文件被自动执行。 __init__.py
文件中也可以利用__all__
来指定导入的模块。
例如,在__init__.py
定义如下内容:
__all__ = ['module1'] # __all__是一个包含了需要在包被导入时自动导入的模块名的列表
在main.py中导入模块module2.py。
from package1 import *
print(module2.num1)
# 输出
NameError: name 'module2' is not defined
由于在__init__.py
文件中指定导入的模块没有module2
,module2.py
不能被导入。
3. 库(Libraries)
库是一组相关的模块和包的集合,它们通常用于解决特定的问题或提供特定领域的功能。Python标准库是一个强大的例子,它包含了许多常用的模块和包,如math
、os
、datetime
等。
# 例子:使用Python标准库中的模块
import math
result = math.sqrt(25)
print(result)
总体来说,Python的组织结构通过模块、包和库的层次化方式,帮助开发者更好地组织和管理代码。这使得代码更具可读性、可维护性,并且有利于代码的复用。
模块导入
import
import只能引入模块,不能直接引入变量或函数。
示例:在main.py文件中导入包package1中的模块module1.py和module2.py。
import package1.module1
import package1.module2 as pm2 # 多层调用太长,可以重命名
from…import
可以导入模块、变量或函数等。
- 导入模块
from package1 import module1
from package1 import module2
- 导入变量或函数
from package1.module1 import var3
- 导入模块下所有内容
from package1.module2 import * # 一般不建议使用*
- 控制模块中对外暴露的内容
在module2.py
模块中定义了__all__=['num1', 'num2']
,则导入模块module2.py
时只可导入num1, num2
,其他内容不可见。
from package1.module2 import *
print(num3)
# 输出
NameError: name 'num3' is not defined
注意,__all__
属性仅在使用import *
时才有效。
from package1.module2 import num3
print(num3)
# 输出
3
- 导入模块换行
# 使用 \
from package1.module2 import num1, \
num2, num3
# 使用(),推荐这种方式
from package1.module2 import (num1,
num2, num3)
包和模块导入注意点
- 包和模块不会重复导入:在导入一个模块的时候,就会执行这个模块里的所有内容,但是多次导入只执行一次。
- 不建议循环引入:多个模块文件间不建议相互调用,会导致报错。
相对导入和绝对导入
- 绝对导入:必须从顶级包开始。
- 相对导入:
.
表示当前目录,..
上一级目录。 - import不能使用相对导入,如import .package2.package4.m2。
- 入口文件不可以使用相对路径来导入模块,只能使用绝对路径。
- python -m main.py 将入口文件当作一个模块执行,则可以使用相对路径导入模块。
模块搜索路径
当我们导入模块时,默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中。sys.path返回一个列表
import sys
print(sys.path)
当我们需要添加自定义的搜索目录时,使用如下命令:
import sys
sys.path.append('自定义模块的路径')
模块推荐导入顺序
在文件中需要导入内置模块、第三方模块或自定义模块时,建议的导入顺序是:标准库模块–第三方模块–自定义模块。