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中处理字符串的相关的len()方法的使用简介
May 19 Python
Python多线程和队列操作实例
Jun 21 Python
简单学习Python time模块
Apr 29 Python
Python中单、双下划线的区别总结
Dec 01 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
自定义Django默认的sitemap站点地图样式
Mar 04 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
Python3爬虫中Ajax的用法
Jul 10 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 Python
python Django框架快速入门教程(后台管理)
Jul 21 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森海MX500,三言两语话神奇
2021/03/02 无线电
thinkPHP引入类的方法详解
2016/12/08 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
javascript 写类方式之一
2009/07/05 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
JavaScript中Function详解
2015/02/27 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
python使用生成器实现可迭代对象
2018/03/20 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
保洁主管岗位职责
2013/11/20 职场文书
会计应届生的自荐信
2013/12/13 职场文书
开业庆典邀请函
2014/01/08 职场文书
大学生学习自我评价
2014/01/13 职场文书
企业宣传标语
2014/06/09 职场文书
会员活动策划方案
2014/08/19 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
图书馆义工感想
2015/08/07 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript