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正则表达式抓取成语网站
Nov 20 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
Python 编码Basic Auth使用方法简单实例
May 25 Python
详解Python 调用C# dll库最简方法
Jun 20 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
Django单元测试工具test client使用详解
Aug 02 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
python实现从wind导入数据
Dec 03 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Python如何加载模型并查看网络
Jul 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循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
javascript类继承机制的原理分析
2009/09/12 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
JS动画实现回调地狱promise的实例代码详解
2018/11/08 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
numpy.where() 用法详解
2019/05/27 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
python使用Geany编辑器配置方法
2020/02/21 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
学生实习自我鉴定
2013/10/11 职场文书
联谊活动策划书
2014/01/26 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
毕业生自荐信范文
2015/03/05 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
Python爬虫基础初探selenium
2021/05/31 Python
PHP 时间处理类Carbon
2022/05/20 PHP