当前位置: 首页 > 编程笔记 >

Python如何将将模块分割成多个文件

桂宏旷
2023-03-14
本文向大家介绍Python如何将将模块分割成多个文件,包括了Python如何将将模块分割成多个文件的使用技巧和注意事项,需要的朋友参考一下

问题

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

解决方案

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

# 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将模块分割成多个文件的资料请关注小牛知识库其它相关文章!

 类似资料:
  • 问题 你想将一个模块分割成多个文件。但是你不想将分离的文件统一成一个逻辑模块时使已有的代码遭到破坏。 解决方案 程序模块可以通过变成包来分割成多个独立的文件。考虑下下面简单的模块: # mymodule.py class A: def spam(self): print('A.spam') class B(A): def bar(self): pr

  • 我正在尝试将我的API文档分解成多个JSON文件,这些文件可以独立编辑。我能找到的所有示例都使用了Swagger1.2模式,它有一个“api”:{}对象来分解它。2.0模式(http://json.schemastore.org/swagger-2.0)中似乎缺少这一点。定义的只是一个“路径”数组,它将所有APIendpoint绑定到这个数组中。这在swagger-ui中的效果是,有一个单一的“默

  • 问题内容: 这就是您如何将列表分成大小均匀的块? 用于将数组拆分为多个块。无论如何,对于使用Numpy的巨型阵列,这样做是否更有效率? 问题答案: 尝试。 从文档中: 与相同,但如果组的长度不相等,则不会引发异常。 如果块数> len(array),您将获得嵌套在内部的空白数组,以解决此问题-如果将拆分数组保存在中,则可以通过以下方式删除空数组: 只需将其保存回去即可。

  • 问题内容: 我想使用PHP将文本拆分成单个单词。你有什么想法要实现吗? 我的方法: 这是一个好方法吗?您有改进的想法吗? 提前致谢! 问题答案: 使用与任何Unicode标点符号匹配的\ p {P}类和\ s空格类。 这将拆分为一组一个或多个空格字符,但也会吸收周围的所有标点符号。它还在字符串的开头或结尾匹配标点符号。这区分了诸如“不要”和“他说’哎呀!’”之类的情况。

  • 我试图使用PHP将查询结果分解成块,但似乎不知道如何制定查询或循环,将结果分解成四个批次,并用特定的超文本标记语言元素包围这四行。 内容特别是一个摄影作品集,我只是尝试一行一行地显示照片,但我需要的样式要求每一行基本上是一组独立的信息。 这是我到目前为止使用的代码: 不过,我只希望列表中有四张图片。然后是另一个列表中的另外四个。您能帮我重新格式化循环,使其返回四条记录,然后开始另一个列表中以下四条

  • 问题内容: 我有一个文本文件。我需要得到一个句子清单。 如何实现呢?有很多细微之处,例如缩写中使用了点。 我的旧正则表达式效果很差: 问题答案: 自然语言工具包满足你的需求。 该群组发布表明这样做: (我还没有尝试过!)