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自动zip压缩目录的方法
Jun 28 Python
Django日志模块logging的配置详解
Feb 14 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
遗传算法之Python实现代码
Oct 10 Python
Python数据可视化正态分布简单分析及实现代码
Dec 04 Python
解决DataFrame排序sort的问题
Jun 07 Python
python模块导入的细节详解
Dec 10 Python
对python生成业务报表的实例详解
Feb 03 Python
python做反被爬保护的方法
Jul 01 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
python用Configobj模块读取配置文件
Sep 26 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编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
python类型强制转换long to int的代码
2013/02/10 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
django 自定义过滤器的实现
2019/02/26 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
python isinstance函数用法详解
2020/02/13 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
Java如何支持I18N?
2016/10/31 面试题
物流管理专业毕业生自荐信
2014/03/04 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
超市客服工作职责
2014/06/11 职场文书
学党史心得体会
2014/09/05 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
2015年教研员工作总结
2015/05/26 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
python前后端自定义分页器
2022/04/13 Python