Python如何将将模块分割成多个文件


Posted in Python onAugust 04, 2020

问题

你想将一个模块分割成多个文件。但是你不想将分离的文件统一成一个逻辑模块时使已有的代码遭到破坏。

解决方案

程序模块可以通过变成包来分割成多个独立的文件。考虑下下面简单的模块:

# mymodule.py
class A:
  def spam(self):
    print('A.spam')

class B(A):
  def bar(self):
    print('B.bar')

假设你想mymodule.py分为两个文件,每个定义的一个类。要做到这一点,首先用mymodule目录来替换文件mymodule.py。 这这个目录下,创建以下文件:

mymodule/
  __init__.py
  a.py
  b.py

在a.py文件中插入以下代码:

# a.py
class A:
  def spam(self):
    print('A.spam')

在b.py文件中插入以下代码:

# b.py
from .a import A
class B(A):
  def bar(self):
    print('B.bar')

最后,在 __init__.py 中,将2个文件粘合在一起:

# __init__.py
from .a import A
from .b import B

如果按照这些步骤,所产生的包MyModule将作为一个单一的逻辑模块:

>>> import mymodule
>>> a = mymodule.A()
>>> a.spam()
A.spam
>>> b = mymodule.B()
>>> b.bar()
B.bar
>>>

讨论

在这个章节中的主要问题是一个设计问题,不管你是否希望用户使用很多小模块或只是一个模块。举个例子,在一个大型的代码库中,你可以将这一切都分割成独立的文件,让用户使用大量的import语句,就像这样:

from mymodule.a import A
from mymodule.b import B
...

这样能工作,但这让用户承受更多的负担,用户要知道不同的部分位于何处。通常情况下,将这些统一起来,使用一条import将更加容易,就像这样:

from mymodule import A, B

对后者而言,让mymodule成为一个大的源文件是最常见的。但是,这一章节展示了如何合并多个文件合并成一个单一的逻辑命名空间。 这样做的关键是创建一个包目录,使用 __init__.py 文件来将每部分粘合在一起。

当一个模块被分割,你需要特别注意交叉引用的文件名。举个例子,在这一章节中,B类需要访问A类作为基类。用包的相对导入 from .a import A 来获取。

整个章节都使用包的相对导入来避免将顶层模块名硬编码到源代码中。这使得重命名模块或者将它移动到别的位置更容易

作为这一章节的延伸,将介绍延迟导入。如图所示,__init__.py文件一次导入所有必需的组件的。但是对于一个很大的模块,可能你只想组件在需要时被加载。 要做到这一点,__init__.py有细微的变化:

# __init__.py
def A():
  from .a import A
  return A()

def B():
  from .b import B
  return B()

在这个版本中,类A和类B被替换为在第一次访问时加载所需的类的函数。对于用户,这看起来不会有太大的不同。 例如:

>>> import mymodule
>>> a = mymodule.A()
>>> a.spam()
A.spam
>>>

延迟加载的主要缺点是继承和类型检查可能会中断。你可能会稍微改变你的代码,例如:

if isinstance(x, mymodule.A): # Error
...

if isinstance(x, mymodule.a.A): # Ok
...

延迟加载的真实例子, 见标准库 multiprocessing/__init__.py 的源码.

以上就是Python如何将将模块分割成多个文件的详细内容,更多关于Python将模块分割成多个文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python3读取文件常用方法实例分析
May 22 Python
深入理解Python3 内置函数大全
Nov 23 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
python内存动态分配过程详解
Jul 15 Python
python tkinter实现屏保程序
Jul 30 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
python 项目目录结构设置
Feb 14 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
粗暴解决CUDA out of memory的问题
May 22 Python
Python 保存加载mat格式文件的示例代码
Aug 04 #Python
python中判断文件结束符的具体方法
Aug 04 #Python
python字典key不能是可以是啥类型
Aug 04 #Python
Python延迟绑定问题原理及解决方案
Aug 04 #Python
Python 使用生成器代替线程的方法
Aug 04 #Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 #Python
python读取xml文件方法解析
Aug 04 #Python
You might like
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
javascript实例分享---具有立体效果的图片特效
2014/06/08 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
Layer弹出层动态获取数据的方法
2018/08/20 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
python解析xml文件实例分享
2013/12/04 Python
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python中DJANGO简单测试实例
2015/05/11 Python
Python中的字符串操作和编码Unicode详解
2017/01/18 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
python图形用户接口实例详解
2019/12/16 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
python计算导数并绘图的实例
2020/02/29 Python
Linux常见面试题
2016/10/04 面试题
物流专业大学生的自我鉴定
2013/11/13 职场文书
大学毕业感言200字
2014/03/09 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
合作协议书模板2014
2014/09/26 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
小学见习报告
2015/06/23 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
python基础之错误和异常处理
2021/10/24 Python
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers