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 专题三 字符串的基础知识
Mar 19 Python
python实现ID3决策树算法
Aug 29 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
三个python爬虫项目实例代码
Dec 28 Python
python重要函数eval多种用法解析
Jan 14 Python
Django自关联实现多级联动查询实例
May 19 Python
Python  word实现读取及导出代码解析
Jul 09 Python
python如何快速拼接字符串
Oct 28 Python
python 实现汉诺塔游戏
Nov 28 Python
Python中的tkinter库简单案例详解
Jan 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
Cookie 小记
2010/04/01 Javascript
jQuery UI的Dialog无法提交问题的解决方法
2011/01/11 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
判断一个变量是数组Array类型的方法
2013/09/16 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
跟老齐学Python之重回函数
2014/10/10 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
python一些性能分析的技巧
2020/08/30 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
受欢迎的大学生自我评价
2013/12/05 职场文书
社会学专业求职信
2014/02/24 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
python opencv通过4坐标剪裁图片
2021/06/05 Python
python的变量和简单数字类型详解
2021/09/15 Python
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis