python模块和包
一. 模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
二. 导入模块
1. 语法:
import 模块名 from 模块名 import 功能名 from 模块名 import * import 模块名 as 别名 from 模块名 import 功能名 as 别名
注意:这里的import后面的模块名一定是模块的全名(全路径名):即 包名.模块名
2. 示例:
2.1 定义模块:
创建mymodule.py文件,并编写方法sum,定义变量name:
def sum(a, b): return a+b name = 'mymodule'
2.2 导入模块:
在demo.py 文件中导入并使用sum方法
2.2.1 "import 模块名" 方式导入模块
import mymodule c = mymodule.sum(1, 2) print(c) # 3
说明:
1. 这种方法导入后,会导入模块中所有的内容
2. 功能调用方法:模块名.功能
2.2.2 "from 模块名 import 功能名" 方式导入模块
from mymodule import sum c = sum(1, 2) print(c) # 3 print(name) # NameError: name 'name' is not defined
说明:
1. 导入的时sum这个功能,因此调用时直接使用sum即可,不需要模块名. 的方式调用
2. mymodule模块中定义的其他功能没有导入,不可调用,如上面的name属性。
3. 也可在import后面使用逗号分隔导入多个功能如:
from mymodule import sum, name c = sum(1, 2) print(c) # 3 print(name) # mymodule
4. 如果需要导入模块所有功能,则import后面使用*号实现
from mymodule import * c = sum(1, 2) print(c) # 3 print(name) # mymodule
2.2.3 给导入的模块或功能取别名
import mymodule as cal c = cal.sum(1, 2) print(c) # 3
from mymodule import sum as ss c = ss(1, 2) print(c) # 3
说明:取别名后,只能使用别名
三. 自定义模块
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。也就是说自定义模块名必须要符合标识符命名规则。
创建一个.py的文件,并在文件中定义模块功能,即创建了一个模块,如上面的mymodule就是一个自定义的模块
3.1 模块中的__name__属性
__name__ 默认值为模块名,当前执行的.py文件的__name__的值自动被设置为"__main__"
import mymodule print(__name__) # __main__ print(mymodule.__name__) # mymodule
说明
1. 当前执行的文件,此属性值为"__main__",而导入的mymodul模块的此属性值为模块名:mymodule
2. 一般使用这一特点定义测试代码,如在mymodule 中定义测试代码:
def sum(a, b): return a+b name = 'mymodule' if __name__ == '__main__': print("测试代码")
3. 如果没有 if __name__ == '__main__': 这行代码,当通过import mymodule方式导入模块时,测试代码会执行,而使用了这个判断后,由于在别的模块导入后,mymodule模块的名称为mymodule,测试代码不会执行
四. 模块定位顺序
当导入一个模块,Python解析器对模块位置的搜索顺序是:
1. 当前目录
2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
- 注意
- 自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
- `使用from 模块名 import 功能`的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
from mymodule import sum def sum(a, b): return 100 print(sum(1, 2)) # 100
def sum(a, b): return 100 from mymodule import sum print(sum(1, 2)) # 3
说明:
1.总规则:后定义的会覆盖先定义的
2.上面代码中后导入mymodule则sum使用的mymodule中的sum,否则使用的是当前文件的sum
3. import 模块名的时候,不用担心功能名称重复,因为是通过模块名.功能的方式调用。不过要注意模块名与其他变量名称重复
五. `__all__`
如果一个模块文件中有`__all__`变量,当使用`from xxx import *`导入时,只能导入这个列表中的元素。
在mymodule中添加`__all__`属性:
__all__ = ['sum'] #使用字符串,而不是变量 def sum(a, b): return a+b name = 'mymodule'
导入所有功能并调用:
from mymodule import * print(sum(1, 2)) # 3 print(name) # NameError: name 'name' is not defined
说明:
1. __all__列表中使用字符串,而不是变量
2. 上面的name没有放在all列表中,因此导入全部功能后,不包括name
六. 包
1.包
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为`__init__.py` 文件,那么这个文件夹就称之为包。
2.新建包
[New] — [Python Package] — 输入包名 — [OK] — 新建功能模块(有联系的模块)。
注意:新建包后,包内部会自动创建`__init__.py`文件,这个文件控制着包的导入行为。
新建包mypackage和包中的模块mymodule1
def print_m(): print("module1...")
3. 在demo.py中导入包中的模块
3.1 包名.模块名 方式导入
语法
import 包名.模块名 包名.模块名.目标功能
示例:
import mypackage.mymodule1 mypackage.mymodule1.print_m() # module1...
3.2 from 包名 import * 导入包中的模块
这种方法导入模块,必须在`__init__.py`文件中添加`__all__ = []`,控制允许导入的模块列表。如果列表为空,则无法导入任何模块
示例:
不在__init__.py中添加__all__列表时:
from mypackage import * mymodule1.print_m() # NameError: name 'mymodule1' is not defined
添加__all__列表并指定可导入模块:
__all__ = ["mymodule1"]
再次执行:
from mypackage import * mymodule1.print_m() # module1...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2018-12-27 springboot中@ConfigurationProperties注解和@EnableConfigurationProperties配合使用获取配置文件属性,封装到bean
2018-12-27 springboot过滤器配置