Python中哪些方法实现了缓冲区接口?
我有一个自定义的类,这个类里面有一个叫做 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__
,接受 int
和 slice
类型的参数。我甚至尝试过实现已经不推荐使用的 __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 个回答
文档上说,
用C语言实现的Python对象可以导出一组叫做“缓冲区接口”的函数。
你的Foo类不是用C实现的,对吧...?
奇怪的是,用纯Python写的类没有特别的方法可以直接实现以支持buffer
接口——这本来是PEP 298的内容,但这个提案已经被撤回了。
我怕你得使用一些明确的属性或方法(或者像str
这样的内置方法,它内部会调用一个特殊的方法)来将你的类的实例传递给file.write
等等:-(。