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中apply函数的用法实例教程
Jul 31 Python
pyenv命令管理多个Python版本
Mar 26 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
python调用动态链接库的基本过程详解
Jun 19 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
Python 硬币兑换问题
Jul 29 Python
Python 如何展开嵌套的序列
Aug 01 Python
详解matplotlib绘图样式(style)初探
Feb 03 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
加强版phplib的DB类
2008/03/31 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
js简单实现标签云效果实例
2015/08/06 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
简介JavaScript错误处理机制
2020/08/04 Javascript
Python读写Redis数据库操作示例
2014/03/18 Python
详解Python字符串对象的实现
2015/12/24 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
基本款天堂:Everlane
2017/05/13 全球购物
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
初中生学习生活的自我评价
2013/11/20 职场文书
项目合作计划书
2014/01/09 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
十八大观后感
2015/06/12 职场文书
话题作文之成长
2019/12/09 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
利用Python实现Picgo图床工具
2021/11/23 Python