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实现KNN分类算法
Dec 22 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
python抓取京东小米8手机配置信息
Nov 13 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
python实现智能语音天气预报
Dec 02 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
python实现简单俄罗斯方块
Mar 13 Python
Python插件机制实现详解
May 04 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
Python实现socket库网络通信套接字
Jun 04 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从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
php intval函数用法总结
2019/04/14 PHP
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
python中format()函数的简单使用教程
2018/03/14 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
Python字符串的修改方法实例
2019/12/19 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
某公司.Net方向面试题
2014/04/24 面试题
三分钟演讲稿范文
2014/04/24 职场文书
公司授权委托书样本
2014/09/15 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2015年财务部工作总结
2015/04/10 职场文书
计算机教师工作总结
2015/08/13 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
五年级语文教学反思
2016/03/03 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang