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中实现参数类型检查的简单方法
Apr 21 Python
Python验证码识别处理实例
Dec 28 Python
python基础教程之分支、循环简单用法
Jun 16 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
创建pycharm的自定义python模板方法
May 23 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
python使用插值法画出平滑曲线
Dec 15 Python
python读取并定位excel数据坐标系详解
Jun 26 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
使用tensorflow根据输入更改tensor shape
Jun 23 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
PHP精确计算功能示例
2016/11/29 PHP
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
python实现下载文件的三种方法
2017/02/09 Python
python中解析json格式文件的方法示例
2017/05/03 Python
详解python 注释、变量、类型
2018/08/10 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
五年级学生评语大全
2014/12/26 职场文书
消防宣传语大全
2015/07/13 职场文书
签约仪式致辞
2015/07/30 职场文书
sql查询结果列拼接成逗号分隔的字符串方法
2021/05/25 SQL Server
Python实现排序方法常见的四种
2021/07/15 Python