У меня есть собственный класс с методом serialize
, и я хочу иметь возможность записать этот класс непосредственно в файлы и получить возвращаемое значение метода serialize
в Python 2.6. (Я не пытаюсь засолить мои объекты, это что-то совершенно другое.) Например:
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? Или я что-то упускаю очевидное?