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实现3行代码解简单的一元一次方程
Aug 18 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
django自带的server 让外网主机访问方法
May 14 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python pandas时序处理相关功能详解
Jul 03 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 Python
Python几种常见算法汇总
Jun 02 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 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 分页类实现代码
2009/12/03 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
浅谈python内置变量-reversed(seq)
2017/06/21 Python
简单实现python画圆功能
2018/01/25 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
pytorch中的inference使用实例
2020/02/20 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
求职信范文英文版
2014/01/05 职场文书
银行员工职业规划范文
2014/01/21 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
施工安全生产承诺书
2014/05/23 职场文书
销售人员工作自我评价
2014/09/21 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
600字作文之感受大自然
2019/11/27 职场文书