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

 更新时间:2026年08月03日 08:29:46   作者:星河耀银海  
想自己写Python模块但不知从何下手,这篇文章手把手教你创建自定义模块,从基本创建导入到命名规范、避免导入时执行代码的副作用,还有组织模块的最佳实践,学会这些,你也能写出结构清晰、易于复用的项目模块,告别代码复制粘贴,需要的朋友可以参考下

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

好消息是:创建一个模块就是创建一个.py文件——没有复杂的配置,没有特殊的语法。

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

# 创建一个文件:utils.py
# 这就是一个模块!

# utils.py 内容:
"""
通用工具函数模块(utils)

提供常用的辅助函数:数据验证、格式化、字符串处理等。
"""

def read_number(prompt="请输入数字: "):
    """读取用户输入的数字(带错误处理)"""
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            print("输入无效,请输入一个数字。")

def clamp(value, min_val, max_val):
    """将值限定在[min_val, max_val]范围内"""
    return max(min_val, min(value, max_val))

def truncate(text, max_length, suffix="..."):
    """截断文本到指定长度"""
    if len(text) <= max_length:
        return text
    return text[: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 =====
"""计算器模块——提供基本数学运算"""

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("除数不能为零")
    return a / b

def power(base, exp):
    return base ** exp

# 模块级常量
PI = 3.141592653589793
E = 2.718281828459045

# ===== main.py =====
import calculator

print(calculator.add(10, 5))       # 15
print(calculator.divide(10, 3))    # 3.3333333333333335
print(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"

class Demo:
    """示例类"""
    pass

def greet():
    print(f"Hello from {NAME}!")

# ✅ 好的做法:只在模块中定义(无副作用的顶层代码)
# ❌ 坏的做法:在模块顶层执行有副作用的操作

# 示例:一个模块的顶层代码对比
# 好的模块
"""
连接配置和工具函数
"""
DATABASE_URL = "postgresql://localhost/mydb"

def connect():
    """连接到数据库"""
    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 =====
"""数据验证模块"""

import re

def is_valid_email(email):
    """验证邮箱格式"""
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return bool(re.match(pattern, email))

def is_valid_phone(phone):
    """验证手机号(中国)"""
    pattern = r'^1[3-9]\d{9}$'
    return bool(re.match(pattern, phone))

def is_strong_password(password):
    """验证密码强度:至少8位,包含字母和数字"""
    return (
        len(password) >= 8
        and any(c.isalpha() for c in password)
        and any(c.isdigit() for c in password)
    )

# ===== formatters.py =====
"""格式化输出模块"""

def format_currency(amount, symbol="¥"):
    """格式化金额"""
    return f"{symbol}{amount:,.2f}"

def format_percent(value, decimals=1):
    """格式化百分比"""
    return f"{value * 100:.{decimals}f}%"

def format_table(headers, rows, col_widths=None):
    """格式化表格"""
    if col_widths is None:
        col_widths = [max(len(str(row[i])) for row in [headers] + rows)
                      for i in range(len(headers))]

    lines = [" | ".join(str(h).ljust(w) for h, w in zip(headers, col_widths))]
    lines.append("-+-".join("-" * w for w in col_widths))
    for row in rows:
        lines.append(" | ".join(str(c).ljust(w) for c, w in zip(row, col_widths)))
    return "\n".join(lines)

# ===== main.py =====
import validators
import formatters

# 使用
print(validators.is_valid_email("test@example.com"))  # True
print(validators.is_strong_password("abc12345"))       # True

headers = ["姓名", "年龄", "城市"]
rows = [("张三", "25", "北京"), ("李四", "30", "上海")]
print(formatters.format_table(headers, rows))

四、总结

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

核心要点:

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

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

以上就是Python自定义模块的创建与调用方法的详细内容,更多关于Python自定义模块创建与调用的资料请关注脚本之家其它相关文章!

相关文章

  • Python+MySQL随机试卷及答案生成程序的示例代码

    Python+MySQL随机试卷及答案生成程序的示例代码

    这篇文章主要介绍了Python+MySQL随机试卷及答案生成程序的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 将Python脚本打包成MACOSAPP程序过程

    将Python脚本打包成MACOSAPP程序过程

    我们编写python程序时,有时候需要想将python脚本转成可执行的程序或者app,可以直接通过双击执行即可,像Windows上可以将其通过工具转换成exe程序,那么在MACOS下我们可以将其打包成MACOS APP程序
    2021-09-09
  • 基于Python实现字符串规范检查与修复程序

    基于Python实现字符串规范检查与修复程序

    在Python开发中,代码风格的统一性对于项目的可维护性至关重要,本文介绍一个智能的Python字符串引号规范自动修复程序,它能够自动检测并修复代码中的字符串引号使用不一致问题,有需要的可以参考下
    2025-10-10
  • 基于Python实现excel拆分和合并工具并打包

    基于Python实现excel拆分和合并工具并打包

    这篇文章介绍了一个基于Python的Excel文件拆分与合并工具,采用模块化设计实现高效处理,系统通过Pandas和openpyxl库支持快速数据操作和格式保留两种模式并提供GUI界面简化操作流程,希望对大家有所帮助
    2026-02-02
  • Python使用PIL库实现图像圆形裁剪

    Python使用PIL库实现图像圆形裁剪

    本文将详细介绍如何使用Python的Pillow库(PIL)实现一个实用的图像处理任务——将图片裁剪为圆形,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • 基于CentOS搭建Python Django环境过程解析

    基于CentOS搭建Python Django环境过程解析

    这篇文章主要介绍了基于CentOS搭建Python Django环境过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python进程崩溃AttributeError异常问题解决

    Python进程崩溃AttributeError异常问题解决

    这篇文章主要介绍了Python进程崩溃(AttributeError异常)问题解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下方法
    2023-06-06
  • pytorch中torch.max和Tensor.view函数用法详解

    pytorch中torch.max和Tensor.view函数用法详解

    今天小编就为大家分享一篇pytorch中torch.max和Tensor.view函数用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python中subprocess实例用法及知识点详解

    python中subprocess实例用法及知识点详解

    在本篇文章里小编给大家分享的是关于python中subprocess实例用法及知识点详解内容,有需要的朋友们可以跟着学习下。
    2021-10-10
  • Python通过OpenPyXL处理Excel的完整教程

    Python通过OpenPyXL处理Excel的完整教程

    OpenPyXL是一个强大的Python库,用于处理Excel文件,允许读取、编辑和创建Excel工作簿和工作表,本文将详细介绍OpenPyXL的各种功能,希望对大家有所帮助
    2023-11-11

最新评论