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 相关文章推荐
编程语言Python的发展史
Sep 26 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
Python 加密的实例详解
Oct 09 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
python用Configobj模块读取配置文件
Sep 26 Python
Python基于mediainfo批量重命名图片文件
Dec 29 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
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
CodeIgniter针对数据库的连接、配置及使用方法
2016/03/03 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
python 线性回归分析模型检验标准--拟合优度详解
2020/02/24 Python
详解python的变量缓存机制
2021/01/24 Python
大学生活学习的自我评价
2013/12/03 职场文书
岗位职责的构建方法
2014/02/01 职场文书
大专学生求职自荐信
2014/07/06 职场文书
群教个人对照检查材料
2014/08/20 职场文书
2014年商场工作总结
2014/11/22 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python