【问题标题】:Creating a stream class in Python在 Python 中创建流类
【发布时间】:2011-07-30 08:09:40
【问题描述】:

我有一个需要包含 XML 文件的流的类。
我不一定想要文件流,我可能想要使用其他来源,如数据库、套接字等。
我需要从io module 继承哪个类才能提供来自其他来源的流接口?

【问题讨论】:

  • 一个套接字已经和另一个文件有相同的接口。数据库连接通常提供一个“blob”,可以使用StringIO 将其转换为文件行对象。当您的“流”接口(即 Python 的 file)已经存在时,为什么要对某些东西进行子类化?有什么独特之处或不同之处?
  • 为什么要派生? Python 不是 C++。您确定只传递具有正确read() 方法的东西还不够吗?
  • @6502: XML 文件可以从数据库加载到流中。我只是在封装行为。
  • @S.Lott:我想要一个已经将 blob 变成类似文件的对象的对象。这种对象应该与文件对象具有相同的接口,以便它与我的需要流的类一起工作。
  • @the_drow。该对象是StringIO.StringIO( blob )。你还需要什么?

标签: python stream


【解决方案1】:

在这种情况下,动态类型允许您不从任何基类继承。您应该实现一些具有正确名称的方法。 Blog post on the subject

【讨论】:

  • 我不明白为什么我不应该子类。无论如何,我的接口应该是流的接口。
  • 我只写了你不能使用继承机制进行子类化,并且可以创建你的类并实现具有所需签名的方法是必要和充分的
【解决方案2】:

Andrey 给出的答案并不完全正确。

在 Python 中,流是“类文件”对象。您可以使用io 模块中定义的工具读取/写入它们。如果要定义流对象,该模块还提供了应实现的接口。

请注意,io 模块区分了三种不同类型的流,它们需要的接口略有不同。 (它们的主要区别在于数据类型。)

  1. 文本 I/O - 接口 TextIOBase
  2. 二进制 I/O - 接口 BufferedIOBase
  3. 原始 I/O - 接口 RawIOBase

例如,StringIO 是 TextIOBase 的内存实现。

请注意,这些接口在 Python 2 和 3 上都可用。

【讨论】:

  • 我需要将一个经过 base64 序列化的文件传递给 openpyxl。我用load_workbook(filename=io.BytesIO(base64.b64decode(base64_file)), read_only=True)
猜你喜欢
  • 2011-01-12
  • 2012-09-10
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2017-01-07
相关资源
最近更新 更多