Python笔记之跨文件实例化、跨文件调用、导入库

code review!
文章目录
- Python笔记之跨文件实例化、跨文件调用、导入库
- 1. 核心对比表格(完整汇总)
- 1.1 自定义模块跨文件调用汇总表
- 1.2 第三方库使用汇总表
- 1.3 导入方式选择决策表
- 2. 基础示例(快速上手)
- 2.1 文件结构
- 2.2 a.py(被导入文件)
- 2.3 b.py(调用文件)
- 2.3.1 方式一:选择性导入
- 2.3.2 方式二:模块导入
- 3. 第三方库使用示例
- 4. 常见问题快速解决
- 5. 最佳实践总结
- 6. 快速参考
1. 核心对比表格(完整汇总)
1.1 自定义模块跨文件调用汇总表
对象类型 | 定义示例 | 导入方式 | 使用方式 | 完整代码示例 | 适用场景 |
---|
类 | class Calculator: | from module_a import Calculator | calc = Calculator() | calc = Calculator("name") | 需要创建多个实例 |
| | import module_a | calc = module_a.Calculator() | calc = module_a.Calculator("name") | 避免命名冲突 |
函数 | def calculate(a, b): | from module_a import calculate | result = calculate(1, 2) | result = calculate(10, 20) | 频繁调用 |
| | import module_a | result = module_a.calculate(1, 2) | result = module_a.calculate(10, 20) | 明确来源 |
变量 | x = 10 | from module_a import x | print(x) | print(f"Value: {x}") | 直接访问 |
| | import module_a | print(module_a.x) | print(f"Value: {module_a.x}") | 保持命名空间 |
预实例化对象 | calculator = Calculator() | from module_a import calculator | calculator.add(1, 2) | result = calculator.add(5, 3) | 共享全局实例 |
| | import module_a | module_a.calculator.add(1, 2) | result = module_a.calculator.add(5, 3) | 明确对象来源 |
类方法 | @classmethod def create(): | from module_a import Calculator | Calculator.create() | obj = Calculator.create() | 工厂方法 |
静态方法 | @staticmethod def validate(): | from module_a import Calculator | Calculator.validate(5) | valid = Calculator.validate(5) | 工具方法 |
包中的类 | package/module.py: class X | from package.module import X | x = X() | x = X("param") | 包结构项目 |
包的公开接口 | __init__.py: from .module import X | from package import X | x = X() | x = X("param") | 包的便捷访问 |
1.2 第三方库使用汇总表
库类型 | 导入方式 | 实例化/使用方式 | 跨文件共享模式 | 代码示例 | 常见用途 |
---|
HTTP请求库 | import requests | session = requests.Session() | 全局session | global_session = requests.Session() | API客户端 |
| from requests import Session | session = Session() | 配置化session | session = Session(); session.headers.update({}) | 自定义配置 |
日志库 | import logging | logger = logging.getLogger(name) | 命名日志器 | app_logger = logging.getLogger("app") | 应用日志 |
| from logging import getLogger | logger = getLogger(name) | 快速访问 | logger = getLogger(__name__) | 模块日志 |
数据库库 | import sqlite3 | conn = sqlite3.connect(db) | 连接池 | conn = sqlite3.connect("app.db") | 数据存储 |
配置库 | import configparser | config = ConfigParser() | 全局配置 | config = ConfigParser(); config.read() | 配置管理 |
JSON库 | import json | json.loads() / json.dumps() | 直接函数调用 | data = json.loads(json_string) | 数据序列化 |
时间库 | import datetime | datetime.now() | 工具函数 | now = datetime.datetime.now() | 时间处理 |
数学库 | import math | math.sqrt() | 直接函数调用 | result = math.sqrt(16) | 数学计算 |
| from math import sqrt | sqrt() | 直接访问 | result = sqrt(16) | 频繁使用 |
1.3 导入方式选择决策表
场景 | 推荐导入方式 | 原因 | 示例 |
---|
只使用1-2个对象 | from module import obj1, obj2 | 简洁直接 | from math import sqrt, pi |
使用多个对象 | import module | 避免命名冲突 | import numpy as np |
对象名很长 | from module import LongClassName as Short | 提高可读性 | from requests import Session as S |
包的公开接口 | from package import PublicClass | 符合设计意图 | from django.http import HttpResponse |
避免命名冲突 | import module1; import module2 | 保持命名空间 | import os; import sys |
条件导入 | try: import optional_lib except: | 可选依赖 | try: import numpy except: numpy = None |
2. 基础示例(快速上手)
2.1 文件结构
a.py
b.py
2.2 a.py(被导入文件)
x = 10def bar():print("bar")class Foo:def hello(self):print("hello")foo = Foo()
2.3 b.py(调用文件)
2.3.1 方式一:选择性导入
from a import Foo, bar, x, foof = Foo()
bar()
print(x)
foo.hello()
2.3.2 方式二:模块导入
import af = a.Foo()
a.bar()
print(a.x)
a.foo.hello()
3. 第三方库使用示例
3.1 HTTP 请求库
import requests
session = requests.Session()
from config import session
response = session.get("https://api.example.com")
3.2 日志库
import logging
logger = logging.getLogger("app")
from logger import logger
logger.info("Application started")
4. 常见问题快速解决
4.1 循环导入
def get_processor():from file_b import DataProcessor return DataProcessor()
4.2 命名冲突
from module_a import Logger as LoggerA
from module_b import Logger as LoggerB
4.3 可选依赖
try:import pandas as pdHAS_PANDAS = True
except ImportError:HAS_PANDAS = Falsedef process_data(data):if HAS_PANDAS:return pd.DataFrame(data)else:return data
5. 最佳实践总结
原则 | 说明 | 示例 |
---|
明确优于简洁 | 清楚表达导入来源 | import requests 而非 from requests import * |
一次性导入 | 在文件顶部集中导入 | 所有import语句放在文件开头 |
避免深层导入 | 减少包的嵌套层次 | from myproject.utils import helper |
使用__all__ | 控制包的公开接口 | __all__ = ["PublicClass", "public_function"] |
文档化依赖 | 明确说明外部依赖 | 在模块顶部注释说明依赖的库 |
6. 快速参考
6.1 导入语法速查
import module
from module import obj
from module import obj as alias
from package.module import obj
from . import module
from ..parent import module
6.2 适用场景速查
- 小脚本:
from module import needed_items
- 大项目:
import module
+ 包结构 - 库开发:使用
__init__.py
控制公开接口 - 可选功能:条件导入 + 异常处理