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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python列表的常用操作方法小结
May 21 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Django自定义分页效果
Jun 27 Python
python微信跳一跳系列之棋子定位颜色识别
Feb 26 Python
django1.11.1 models 数据库同步方法
May 30 Python
Django实战之用户认证(初始配置)
Jul 16 Python
python 对字典按照value进行排序的方法
May 09 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 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 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
php session劫持和防范的方法
2013/11/12 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
setTimeout学习小结
2017/02/08 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
详解node.js 事件循环
2020/07/22 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
趣味体育活动方案
2014/02/08 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书