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程序中使用Cookie的教程
Apr 30 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
python生成器与迭代器详解
Jan 01 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
django中SMTP发送邮件配置详解
Jul 19 Python
Django 缓存配置Redis使用详解
Jul 23 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
一篇文章弄懂Python中的内建函数
Aug 07 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
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
php实现RSA加密类实例
2015/03/26 PHP
自写简单JS判断是否已经弹出页面
2010/10/20 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
详解JS去重及字符串奇数位小写转大写
2016/12/29 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
ES6入门教程之let、const的使用方法
2019/04/13 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
python的pdb调试命令的命令整理及实例
2017/07/12 Python
vscode 远程调试python的方法
2017/12/01 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
用Python制作音乐海报
2021/01/26 Python
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
奇怪的鱼:Weird Fish
2018/03/18 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
美容院经理岗位职责
2014/04/03 职场文书
甜品店创业计划书
2014/08/14 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
交通处罚决定书
2015/06/24 职场文书