当前位置: 首页 > news >正文

Python模块:自定义模块的创建与调用方法

Python模块:自定义模块的创建与调用方法

一、开篇:写一个自己的模块

你已经用了很多内置模块(mathrandomos…),现在是时候创建你自己的模块了。好消息是:创建一个模块就是创建一个.py文件——没有复杂的配置,没有特殊的语法。

⌨️ 来吧,从一个简单的工具模块开始:

# 创建一个文件:utils.py# 这就是一个模块!# utils.py 内容:""" 通用工具函数模块(utils) 提供常用的辅助函数:数据验证、格式化、字符串处理等。 """defread_number(prompt="请输入数字: "):"""读取用户输入的数字(带错误处理)"""whileTrue:try:returnfloat(input(prompt))exceptValueError:print("输入无效,请输入一个数字。")defclamp(value,min_val,max_val):"""将值限定在[min_val, max_val]范围内"""returnmax(min_val,min(value,max_val))deftruncate(text,max_length,suffix="..."):"""截断文本到指定长度"""iflen(text)<=max_length:returntextreturntext[:max_length-len(suffix)]+suffix# 使用(在同一个文件或另一个.py文件中):# import utils# age = utils.read_number("请输入年龄: ")# score = utils.clamp(age, 0, 150)

💡 创建自定义模块就是如此简单。但真正的艺术在于组织模块:把什么放在一起、怎么命名、怎么处理模块级别的可执行代码,以及如何让模块既可以直接运行又可以被导入。

二、创建自定义模块

2.1 基本创建和导入

# 假设当前目录结构:# my_project/# ├── main.py# └── calculator.py ← 我们要创建的模块# ===== calculator.py ====="""计算器模块——提供基本数学运算"""defadd(a,b):returna+bdefsubtract(a,b):returna-bdefmultiply(a,b):returna*bdefdivide(a,b):ifb==0:raiseValueError("除数不能为零")returna/bdefpower(base,exp):returnbase**exp# 模块级常量PI=3.141592653589793E=2.718281828459045# ===== main.py =====importcalculatorprint(calculator.add(10,5))# 15print(calculator.divide(10,3))# 3.3333333333333335print(calculator.PI)# 3.141592653589793

2.2 模块文件命名规则

# ⚠️ 模块命名注意事项:# 1. 不能和Python内置模块重名# ❌ 不要创建:math.py、random.py、json.py、os.py# 这会"遮蔽"标准库的同名模块!# 2. 不能和已安装的第三方库重名# ❌ 如果装了requests库,不要创建 requests.py# 3. 使用小写字母和下划线(PEP 8)# ✅ utils.py, data_processor.py, email_service.py# ❌ Utils.py, DataProcessor.py, email-service.py# 4. 避免使用Python关键字# ❌ class.py, import.py, from.py, if.py# 5. 使用有意义的名字# ✅ user_manager.py# ❌ um.py, stuff.py, temp.py

2.3 模块中的可执行代码

# ⚠️ 注意:导入模块时,模块中的所有顶层代码都会执行!# ===== demo_module.py =====print("模块被加载了!")# ← 这行会在import时执行!NAME="demo_module"VERSION="1.0.0"classDemo:"""示例类"""passdefgreet():print(f"Hello from{NAME}!")# ✅ 好的做法:只在模块中定义(无副作用的顶层代码)# ❌ 坏的做法:在模块顶层执行有副作用的操作# 示例:一个模块的顶层代码对比# 好的模块""" 连接配置和工具函数 """DATABASE_URL="postgresql://localhost/mydb"defconnect():"""连接到数据库"""pass# 坏的模块""" 这个模块在导入时就连接数据库——不好! """# db = connect() # 先注释掉——每次import都连接数据库!浪费且不可控# data = load_all_data() # 同样的问题

三、模块的组织和最佳实践

3.1 功能相关的代码放在同一个模块

# ✅ 好的组织# user_service.py —— 用户相关的所有业务逻辑# email_utils.py —— 邮件发送相关的工具函数# validators.py —— 数据验证函数集合# config.py —— 应用配置常量# ❌ 不好的组织# everything.py —— 所有函数混在一起# helpers.py —— "杂项"模块(当文件名就是"各种帮助函数"时,往往意味着缺乏组织)

3.2 实战:创建一组项目模块

# 项目结构:# my_project/# ├── main.py# ├── validators.py —— 数据验证# ├── formatters.py —— 格式化输出# └── converters.py —— 数据转换# ===== validators.py ====="""数据验证模块"""importredefis_valid_email(email):"""验证邮箱格式"""pattern=r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'returnbool(re.match(pattern,email))defis_valid_phone(phone):"""验证手机号(中国)"""pattern=r'^1[3-9]\d{9}$'returnbool(re.match(pattern,phone))defis_strong_password(password):"""验证密码强度:至少8位,包含字母和数字"""return(len(password)>=8andany(c.isalpha()forcinpassword)andany(c.isdigit()forcinpassword))# ===== formatters.py ====="""格式化输出模块"""defformat_currency(amount,symbol="¥"):"""格式化金额"""returnf"{symbol}{amount:,.2f}"defformat_percent(value,decimals=1):"""格式化百分比"""returnf"{value*100:.{decimals}f}%"defformat_table(headers,rows,col_widths=None):"""格式化表格"""ifcol_widthsisNone:col_widths=[max(len(str(row[i]))forrowin[headers]+rows)foriinrange(len(headers))]lines=[" | ".join(str(h).ljust(w)forh,winzip(headers,col_widths))]lines.append("-+-".join("-"*wforwincol_widths))forrowinrows:lines.append(" | ".join(str(c).ljust(w)forc,winzip(row,col_widths)))return"\n".join(lines)# ===== main.py =====importvalidatorsimportformatters# 使用print(validators.is_valid_email("test@example.com"))# Trueprint(validators.is_strong_password("abc12345"))# Trueheaders=["姓名","年龄","城市"]rows=[("张三","25","北京"),("李四","30","上海")]print(formatters.format_table(headers,rows))

四、总结

创建自定义模块就是把代码组织到.py文件中——简单自然。好的模块组织让项目结构清晰,代码复用变得轻松。

💡核心要点:

  1. 一个.py文件 = 一个模块——没有特殊语法
  2. 命名要规范——小写+下划线,不跟标准库冲突
  3. 警惕顶层可执行代码——import时会执行,避免副作用
  4. 功能相关放一起——一个模块一个明确职责
  5. 模块文档——模块的docstring说明模块的用途

✅ 模块化思维:当你发现自己在不同文件中复制粘贴同样的函数时,就该把它提取到独立模块中了。

http://www.jsqmd.com/news/1313338/

相关文章:

  • 东南大学通信复试攻略:从专业课到科研项目,全方位备战指南
  • 从LPL内战强势到S赛突破:解构电竞战队稳定性与适应性的技术分析
  • ComfyUI IPAdapter Plus终极指南:3步实现精准AI图像风格迁移
  • LaTeX表格宽度控制:缩放与定宽两种方法详解
  • Jetson与JetPack关系解析:嵌入式AI开发环境搭建与优化指南
  • ZenlessZoneZero-OneDragon:解放双手的绝区零全自动游戏助手终极指南
  • KCN-GenshinServer:5分钟搭建原神私服的终极免费解决方案
  • 潍坊电子变压器源头工厂TOP5排行榜参考:恒信电器年产能力与交付体系解析 - 新思维商业观察
  • Windows平台AI助手Skywork桌面版实战指南
  • 自动驾驶核心技术解析:从感知、决策到控制的全栈技术栈
  • 终极网盘直链下载助手:如何通过开源工具提升九大平台下载效率
  • 记录常用的HIVE set参数
  • 解密Wallpaper Engine资源格式:RePKG工具深度技术解析与实战指南
  • 上海地埋式箱泵一体化厂家推荐:技术选型与供应商综合评估(2026年) - 优质品牌商家
  • DRG存档编辑器完整指南:5分钟快速掌握《深岩银河》资源修改技巧
  • 扩散模型驱动的AI药物设计:从靶标感知到亲和力优化
  • NodeMCU物联网开发板:从硬件拆解到项目实战的完整指南
  • 信号处理中的三种卷积:线性、周期与圆周卷积详解
  • Android .so 文件压缩
  • 终极指南:如何在macOS上免费运行Windows软件?Whisky完整教程
  • 3步搞定:Get cookies.txt LOCALLY本地Cookie安全导出完全指南
  • Unity GUIText报错修复:从兼容性调整到UGUI迁移全攻略
  • Jetson开发板GPIO编程实战:从引脚定义到AI联动控制
  • 告别频道切换烦恼:Plex IPTV插件让您的媒体中心变身全能直播平台
  • 终极指南:使用Steam游戏自动破解工具实现游戏完全自主控制
  • UE4SS终极指南:5个核心功能解锁虚幻引擎游戏无限可能
  • iOS海外工具类应用上架苹果商店全流程指南
  • 5个理由告诉你为什么fre:ac是2025年最值得拥有的免费音频转换器
  • 3分钟掌握图像矢量化:用vectorizer将PNG/JPG无损转换为SVG的完整指南
  • 抖音批量下载神器:5分钟上手,效率提升10倍的免费工具