问题

你想将一个模块分割成多个文件。但是你不想将分离的文件统一成一个逻辑模块时使已有的代码遭到破坏。

解决方案

程序模块可以通过变成包来分割成多个独立的文件。考虑下下面简单的模块:

1

2

3

4

5

6

7

8

# mymodule.py

class A:

def spam(self):

print('A.spam')

class B(A):

def bar(self):

print('B.bar')

假设你想mymodule.py分为两个文件,每个定义的一个类。要做到这一点,首先用mymodule目录来替换文件mymodule.py。 这这个目录下,创建以下文件:

1

2

3

4

mymodule/

__init__.py

a.py

b.py

在a.py文件中插入以下代码:

1

2

3

4

# a.py

class A:

def spam(self):

print('A.spam')

在b.py文件中插入以下代码:

1

2

3

4

5

# b.py

from .aimport A

class B(A):

def bar(self):

print('B.bar')

最后,在 __init__.py 中,将2个文件粘合在一起:

1

2

3

# __init__.py

from .aimport A

from .bimport B

如果按照这些步骤,所产生的包MyModule将作为一个单一的逻辑模块:

1

2

3

4

5

6

7

8

>>>import mymodule

>>> a= mymodule.A()

>>> a.spam()

A.spam

>>> b= mymodule.B()

>>> b.bar()

B.bar

>>>

讨论

在这个章节中的主要问题是一个设计问题,不管你是否希望用户使用很多小模块或只是一个模块。举个例子,在一个大型的代码库中,你可以将这一切都分割成独立的文件,让用户使用大量的import语句,就像这样:

1

2

3

from mymodule.aimport A

from mymodule.bimport B

...

这样能工作,但这让用户承受更多的负担,用户要知道不同的部分位于何处。通常情况下,将这些统一起来,使用一条import将更加容易,就像这样:

1

from mymoduleimport A, B

对后者而言,让mymodule成为一个大的源文件是最常见的。但是,这一章节展示了如何合并多个文件合并成一个单一的逻辑命名空间。 这样做的关键是创建一个包目录,使用 __init__.py 文件来将每部分粘合在一起。

当一个模块被分割,你需要特别注意交叉引用的文件名。举个例子,在这一章节中,B类需要访问A类作为基类。用包的相对导入 from .a import A 来获取。

整个章节都使用包的相对导入来避免将顶层模块名硬编码到源代码中。这使得重命名模块或者将它移动到别的位置更容易

作为这一章节的延伸,将介绍延迟导入。如图所示,__init__.py文件一次导入所有必需的组件的。但是对于一个很大的模块,可能你只想组件在需要时被加载。 要做到这一点,__init__.py有细微的变化:

1

2

3

4

5

6

7

8

# __init__.py

def A():

from .aimport A

return A()

def B():

from .bimport B

return B()

在这个版本中,类A和类B被替换为在第一次访问时加载所需的类的函数。对于用户,这看起来不会有太大的不同。 例如:

1

2

3

4

5

>>>import mymodule

>>> a= mymodule.A()

>>> a.spam()

A.spam

>>>

延迟加载的主要缺点是继承和类型检查可能会中断。你可能会稍微改变你的代码,例如:

1

2

3

4

5

if isinstance(x, mymodule.A):# Error

...

if isinstance(x, mymodule.a.A):# Ok

...

延迟加载的真实例子, 见标准库 multiprocessing/__init__.py 的源码.

以上就是Python如何将将模块分割成多个文件的详细内容,更多关于Python将模块分割成多个文件的资料请关注服务器之家其它相关文章!

原文链接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c10/p04_split_module_into_multiple_files.html

对python来说、一个模块就是一个文件-Python如何将将模块分割成多个文件相关推荐

  1. pdf怎么分割成多个文件?有两种方式

    pdf怎么分割成多个文件?遇到这种问题的小伙伴应该是手头上的文件过大或者需要分章节展示部分文件,PDF一般来说并不好编辑修改,但可以借助一些编辑软件来处理.下面就给大家介绍两种分割方式,解决这一问题. ...

  2. php怎么分割页面,用html如何把页面分割成多个文件,由多个文件拼接而成?

    用html如何把页面分割成多个文件,由多个文件拼接而成? 更新时间:2014-11-10  作者:久久经验网  来源:久久经验网  所属分类:Web前端 摘要:静态html分割页面,达到类似php等动 ...

  3. python批量实现将文件夹内的每张图片分割成多张

    一.说在前面 需求:有一张长为960,宽为96的图片,需要将其分割成10张96*96的图片并存放在另外一个文件夹下,通过手工分割耗时且不规范,选择python写一个简单的程序完成. 二.源码 # -* ...

  4. 打包php程序为安装文件,zblogphp主题和插件怎么打包成.zba格式文件

    把zblogphp的主题或插件打包成.zba格式文件,相当于把主题或插件下载到我们的电脑中,且格式是zblogphp网站程序专用的.zba格式,因为zblogphp只支持zba格式文件的主题和插件上传 ...

  5. Linux tar命令总结:Linux下对文件进行打包、压缩并分割成指定大小

    1.普通tar压缩命令 tar -zcvf andywang.tar.gz andywang //将andywang文件夹压缩成andywang.tar.gz 2.压缩后的文件太大,需要将andywa ...

  6. linux shell 切割文件,linux shell 将文件按照行数以及顺序拆分成多个文件

    awk -vf=3 -vl="`wc -l file`" 'BEGIN{p=int(l/f);q=(l%f);for(n=1;n<=f;n++)a[n]=n*p+((n< ...

  7. linux怎么随机按行打散文件,linux shell 将文件按照行数以及顺序拆分成多个文件...

    awk -vf=3 -vl="`wc -l file`" 'BEGIN{p=int(l/f);q=(l%f);for(n=1;n<=f;n++)a[n]=n*p+((n< ...

  8. 怎么把PDF分割成几个文件?分享几种分割方法

    PDF文件怎么分割成几个PDF文件呢?PDF文件大家都不陌生,不管是学习还是工作都会用得到,当我们遇到一份文件发现内容不完全需要,只要把它分割成几个有用的问价就可以了,应该怎么做呢?相信还有很多小伙伴 ...

  9. 使用VBA将Excel工作表分割成多个文件

    问题描述 有一个表格,具体数据如下图所示.这里需要按城市(即B列数据)对表格进行拆分,拆分出多个以城市名称命名的xlsx文件,每个xlsx文件都只包含当前城市的数据.  相关资料 之前没有接触过Exc ...

最新文章

  1. 【活动】人工智能产学研生态建设研讨会报名
  2. 【Java面试题】docker启动失败原因
  3. 数字对 (长乐一中模拟赛day2T2)
  4. 130塔式服务器系统,PowerEdge T130塔式服务器怎么样
  5. leetcode之回溯backtracing专题4
  6. mysql and 和where_如何使用mysql查询where条件里的or和and
  7. 关于公司RIA的选型问题
  8. OpenVAS安装说明
  9. 设置ubuntu Android sdk JDK环境变量
  10. Java正则表达式【详解】
  11. 35KV,110KV变电所设计,供配电电气部分设计,总降压变电所设计
  12. 表格中合并同类项并求和(物料统计) 并去除数据中的公式项
  13. P4556 雨天的尾巴 线段树合并
  14. CSDN:借助工具对【本博客访问来源】进行数据图表可视化(网友主要来自欧美和印度等)——记录数据来源截止日期20190811
  15. java操作跨页的word cell_Java 创建Word表格/嵌套表格、添加/复制表格行或列、设置表格跨页断行...
  16. 小程序登录授权获取用户信息
  17. 新手也能每天挣300,今日头条的这5个隐藏玩法,你知道吗?
  18. 《机器学习实战》学习笔记(三):决策树
  19. 英国脱欧 光伏人怎么看?
  20. 兼容性事件监听完美封装addEvent

热门文章

  1. 流程表单中js如何清空SheetUser控件数据?
  2. C#读取SHAPEFILE文件总结0--大纲
  3. python---基础知识回顾(五)(python2.7和python3.5中的编码)
  4. Struts2中的拦截器
  5. 十个简单好用的设计技巧[SM]
  6. 使用抽象等设计工具创建一个稳固的核心机制
  7. 如何禁用双击窗体图标关闭窗体
  8. 大学计算机基础课程报告python-Python程序设计习题解析(大学计算机基础教育规划教材)...
  9. python基础教程视频教程百度云-Python零基础入门学习视频教程全42集百度云网盘下载...
  10. python类型-Python数据类型详解