【发布时间】:2010-01-16 23:08:40
【问题描述】:
我有一个带有 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 扩展类中实现的东西吗?还是我遗漏了一些明显的东西?
【问题讨论】: