Mam niestandardową klasę z metodą serialize
i chcę móc napisać tę klasę bezpośrednio do plików i mieć zapisaną wartość zwracaną przez metodę serialize
, w Pythonie 2.6. (I nie próbuję pickle moich przedmiotów, to jest coś zupełnie innego). Na przykład:Jakie metody implementują interfejs bufora w Pythonie?
class Foo(object):
def serialize(self):
return "Hello World!"
__str__ = serialize
foo = Foo()
f = open("foo.dat", "wb")
f.write(foo)
Jednak, kiedy uruchomić ten kod, otrzymuję następujący wyjątek
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument 1 must be convertible to a buffer, not Foo
porządku, więc potrzebuję mojej klasy Foo
do implementacji interfejsu buffer
. Widzę nawet w the buffer documentation, że mówi: "Przykładowym użytkownikiem interfejsu bufora jest metoda write() obiektu pliku. Każdy obiekt, który może wyeksportować serię bajtów poprzez interfejs bufora, może zostać zapisany do pliku."
Najwyraźniej mogę zrobić, co chcę, ale doktorzy nie mówią, które metody muszę zastosować, aby zaimplementować interfejs bufora. Próbowałem już wdrożyć __str__
, __unicode__
, __len__
, a nawet __sizeof__
. Zaimplementowałem __getitem__
, __setitem__
i __delitem__
, przyjmując argumenty zarówno int
, jak i . Próbowałem nawet wdrożyć wycofane metody, aby być bezpiecznym. Bez względu na to, co próbuję, nadal otrzymuję dokładnie taki sam wyjątek.
Dla porównania, oto sposoby wbudowanym klasy 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__']
które chciałbym uniknąć wdrożenia wszyscy jeden po drugim, a ja szczególnie lubię, aby znaleźć dokumentację dokładnie jakie metody są konieczne.
Czy jest to coś, co można zaimplementować tylko w klasach rozszerzających C? Czy może brakuje mi czegoś oczywistego?
Niestety, dzięki za potwierdzenie tego, nie mogłem znaleźć niczego na własną rękę, który wyraźnie powiedział, że nie możesz zaimplementować interfejsu bufora w Pythonie. –