Какие методы реализуют интерфейс буфера в 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. Я даже вижу в документацию о буфере, в которой говорится: "Пример пользователя интерфейса буфера - это метод 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? Или я пропущу что-то очевидное?

Ответы

Ответ 1

В частности, нет специальных методов, которые класс с чистым Python-кодом мог бы реализовать непосредственно для поддержки интерфейса buffer, который был бы PEP 298, но он был отозван.

Я боюсь, что вам придется использовать какой-то явный атрибут или метод (или встроенный, как str, который внутренне вызывает специальный метод), чтобы передать экземпляры вашего класса в file.write & c:-(.

Ответ 2

В документации говорится:

Объекты Python, реализованные в C, могут экспортировать группу функций, называемых "буферный интерфейс".

Ваш класс Foo не реализован в C, это...?