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操作列表的常用方法分享
Feb 13 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
django之session与分页(实例讲解)
Nov 13 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 Python
Python实现SMTP邮件发送
Jun 16 Python
python自动化发送邮件实例讲解
Jan 04 Python
详解pandas映射与数据转换
Jan 22 Python
Python实现单例模式的5种方法
Jun 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
JavaScript 组件之旅(四):测试 JavaScript 组件
2009/10/28 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
JQuery ZTree使用方法详解
2017/01/07 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python多线程实例教程
2014/09/06 Python
Python装饰器decorator用法实例
2014/11/10 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
kafka-python 获取topic lag值方式
2019/12/23 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
Python decimal模块使用方法详解
2020/06/08 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
用python对oracle进行简单性能测试
2020/12/05 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
酒店总经理助理职责
2014/02/12 职场文书
中学清明节活动总结
2014/07/04 职场文书