Python中哪些方法实现了缓冲区接口?

13 投票
2 回答
6594 浏览
提问于 2025-04-15 18:06

我有一个自定义的类,这个类里面有一个叫做 serialize 的方法。我想直接把这个类写入文件,并且希望这个 serialize 方法的返回值能够被写入文件,使用的是 Python 2.6。(我并不是想要用 pickle 来处理我的对象,这完全是另一回事。)比如说:

class Foo(object):
    def serialize(self):
        return "Hello World!"
    __str__ = serialize

foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)

但是,当我运行这段代码时,我遇到了以下异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo

好吧,我需要我的 Foo 类实现 buffer 接口。我甚至在 buffer 文档 中看到,它提到:“buffer 接口的一个示例用户是文件对象的 write() 方法。任何可以通过 buffer 接口导出一系列字节的对象都可以被写入文件。”

所以显然我可以实现我想要的功能,但文档并没有具体说明我需要实现哪些方法才能实现 buffer 接口。我尝试过实现 __str____unicode____len__,甚至还有 __sizeof__。我还实现了 __getitem____setitem____delitem__,接受 intslice 类型的参数。我甚至尝试过实现已经不推荐使用的 __getslice____setslice____delslice__ 方法,以防万一。无论我尝试什么,我仍然得到完全相同的异常。

作为参考,这里是 buffer 内置类的方法:

>>> dir(buffer)
['__add__', '__class__', '__cmp__', '__delattr__', '__delitem__', '__delslice__',
 '__doc__', '__format__', '__getattribute__', '__getitem__', '__getslice__', 
'__hash__', '__init__', '__len__', '__mul__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__',  '__rmul__', '__setattr__', '__setitem__', 
'__setslice__', '__sizeof__', '__str__', '__subclasshook__']

我希望能避免一个一个地实现这些方法,特别是我想找到具体哪些方法是必要的文档。

这是只能在 C 扩展类中实现的功能吗?还是我漏掉了什么明显的东西?

2 个回答

1

文档上说,

用C语言实现的Python对象可以导出一组叫做“缓冲区接口”的函数。

你的Foo类不是用C实现的,对吧...?

13

奇怪的是,用纯Python写的类没有特别的方法可以直接实现以支持buffer接口——这本来是PEP 298的内容,但这个提案已经被撤回了。

我怕你得使用一些明确的属性或方法(或者像str这样的内置方法,它内部会调用一个特殊的方法)来将你的类的实例传递给file.write等等:-(。

撰写回答