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使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
收藏整理的一些Python常用方法和技巧
May 18 Python
Python中的集合类型知识讲解
Aug 19 Python
Python自定义线程类简单示例
Mar 23 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Python 依赖库太多了该如何管理
Nov 08 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
python 制作简单的音乐播放器
Nov 25 Python
python中random模块详解
Mar 01 Python
python入门之算法学习
Apr 22 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性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
python创建线程示例
2014/05/06 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python面向对象之继承代码详解
2018/01/29 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
违纪检讨书2000字
2014/02/08 职场文书
教师廉洁自律承诺书
2014/05/26 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
黄山导游词
2015/01/31 职场文书
婚育证明格式
2015/06/17 职场文书
新教师教学工作总结
2015/08/14 职场文书
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers