Tengo una clase personalizada con un método serialize
, y quiero poder escribir esta clase directamente en los archivos y obtener el valor devuelto del método serialize
escrito, en Python 2.6. (No estoy tratando de pickle mis objetos, esto es algo totalmente diferente.) Por ejemplo:¿Qué métodos implementan la interfaz del búfer en Python?
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Sin embargo, cuando ejecuta este código, me sale el siguiente excepción
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
bien, entonces necesito mi clase Foo
para implementar la interfaz buffer
. Incluso veo en the buffer documentation que dice: "Un usuario de ejemplo de la interfaz del búfer es el método write() del objeto de archivo. Cualquier objeto que pueda exportar una serie de bytes a través de la interfaz del búfer puede escribirse en un archivo".
Parece que puedo hacer lo que quiero, pero los documentos no dicen qué métodos necesito implementar para poder implementar la interfaz del buffer. Intenté implementar __str__
, __unicode__
, __len__
e incluso __sizeof__
. Implementé __getitem__
, __setitem__
y __delitem__
, aceptando los argumentos int
y slice
. Incluso he intentado implementar los métodos obsoletos __getslice__
, __setslice__
y __delslice__
para estar seguro. No importa lo que intente, todavía obtengo exactamente la misma excepción.
Como referencia, aquí están los métodos de la clase incorporada 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__']
que me gustaría evitar la aplicación de todos ellos, uno por uno, y sobre todo me gustaría encontrar la documentación sobre exactamente qué métodos son necesarios
¿Es esto algo que solo se puede implementar en las clases de extensión C? ¿O me estoy perdiendo algo obvio?
Por desgracia, gracias por confirmar esto, no pude encontrar nada por mi cuenta que explícitamente dijera que no se puede implementar la interfaz de búfer en Python. –