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

时间:2010-01-16 23:08:41

标签: python buffer

我有一个带有serialize方法的自定义类,我希望能够将此类直接编写到文件中,并在Python 2.6中编写serialize方法的返回值。 (我不是试图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接口。我甚至在the buffer documentation中看到它说:“缓冲区接口的示例用户是文件对象的write()方法。任何可以通过缓冲区接口导出一系列字节的对象都可以写入文件。 “

显然我可以做我想做的事,但是文档实际上并没有说明我需要实现哪些方法来实现缓冲区接口。我已尝试实施__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 个答案:

答案 0 :(得分:12)

特别是,没有特殊的方法可以让纯Python编码类直接实现以支持buffer接口 - 本来是PEP 298,但它已被撤销。

我担心您必须使用一些明确的属性或方法(或内部调用特殊方法的内置str)将您的类的实例传递给file.write&amp; C: - (

答案 1 :(得分:1)

文档说,

  

用C实现的Python对象可以   导出一组称为的函数   “缓冲界面。”

您的Foo类未在C中实现,是吗......?