我有一个带有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__
,同时接受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扩展类中实现?或者我错过了一些明显的东西?
答案 0 :(得分:12)
特别是,没有特殊的方法可以让纯Python编码类直接实现以支持buffer
接口 - 本来是PEP 298,但它已被撤销。
我担心您必须使用一些明确的属性或方法(或内部调用特殊方法的内置str
)将您的类的实例传递给file.write
&amp; C: - (
答案 1 :(得分:1)
文档说,
用C实现的Python对象可以 导出一组称为的函数 “缓冲界面。”
您的Foo类未在C中实现,是吗......?