У меня есть таможенный класс с a serialize
метод, и я хочу быть в состоянии написать этот класс непосредственно файлам и иметь возвращаемое значение serialize
метод написан в Пайтоне 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 "", line 1, in
TypeError: argument 1 must be convertible to a buffer, not Foo
Хорошо, таким образом, мне нужен мой Foo
класс, чтобы осуществить buffer
интерфейс. Я даже вижу в буферной документации, что она говорит: «Пользователь в качестве примера буферного интерфейса - объект файла, пишут () метод. Любой объект, который может экспортировать ряд байтов через буферный интерфейс, может быть написан файлу».
Так, по-видимому, я могу сделать то, что я хочу, но доктора на самом деле не говорят, какие методы я должен осуществить, чтобы осуществить буферный интерфейс. Я попытался осуществить __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? Или я пропускаю что-то очевидное?
Особенно нет особых методов, которые чистый класс кодированного чистого питона может напрямую реализовать для поддержки интерфейса буфера
- это было бы PEP 298 , но это было отозвано.
Я боюсь, что вам придется использовать некоторые явный атрибут или метод (или встроенный, как STR
, который внутренне вызывает специальный метод), чтобы пройти экземпляры вашего класса на файл. Напишите
& C :-(.
Документация говорит,
Объекты Python, реализованные в C могут Экспорт группы функций, называемых «Интерфейс буфера».
Ваш класс Foo не реализован в C, это ...?