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

Python模块:自定义模块的创建与调用方法
Python模块自定义模块的创建与调用方法一、开篇写一个自己的模块你已经用了很多内置模块math、random、os…现在是时候创建你自己的模块了。好消息是创建一个模块就是创建一个.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):returnabdefsubtract(a,b):returna-bdefmultiply(a,b):returna*bdefdivide(a,b):ifb0:raiseValueError(除数不能为零)returna/bdefpower(base,exp):returnbase**exp# 模块级常量PI3.141592653589793E2.718281828459045# main.py importcalculatorprint(calculator.add(10,5))# 15print(calculator.divide(10,3))# 3.3333333333333335print(calculator.PI)# 3.1415926535897932.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.py2.3 模块中的可执行代码# ⚠️ 注意导入模块时模块中的所有顶层代码都会执行# demo_module.py print(模块被加载了)# ← 这行会在import时执行NAMEdemo_moduleVERSION1.0.0classDemo:示例类passdefgreet():print(fHello from{NAME}!)# ✅ 好的做法只在模块中定义无副作用的顶层代码# ❌ 坏的做法在模块顶层执行有副作用的操作# 示例一个模块的顶层代码对比# 好的模块 连接配置和工具函数 DATABASE_URLpostgresql://localhost/mydbdefconnect():连接到数据库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):验证邮箱格式patternr^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$returnbool(re.match(pattern,email))defis_valid_phone(phone):验证手机号中国patternr^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,decimals1):格式化百分比returnf{value*100:.{decimals}f}%defformat_table(headers,rows,col_widthsNone):格式化表格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(testexample.com))# Trueprint(validators.is_strong_password(abc12345))# Trueheaders[姓名,年龄,城市]rows[(张三,25,北京),(李四,30,上海)]print(formatters.format_table(headers,rows))四、总结创建自定义模块就是把代码组织到.py文件中——简单自然。好的模块组织让项目结构清晰代码复用变得轻松。核心要点一个.py文件 一个模块——没有特殊语法命名要规范——小写下划线不跟标准库冲突警惕顶层可执行代码——import时会执行避免副作用功能相关放一起——一个模块一个明确职责模块文档——模块的docstring说明模块的用途✅ 模块化思维当你发现自己在不同文件中复制粘贴同样的函数时就该把它提取到独立模块中了。