2010-01-16 10 views
13

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?

Odpowiedz

11

Co ciekawe, nie ma specjalnych metod, które klasa kodu czysto-Python może bezpośrednio implementować do obsługi interfejsu buffer - to byłby PEP 298, ale został wycofany.

Obawiam się, że trzeba użyć jakiś wyraźny atrybut lub metody (lub wbudowanej jak str które wewnętrznie wywołuje specjalnej metody), aby przekazać instancji Twojego klasa do file.write & c :-(.

+0

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. –

1

Dokumentacja mówi

Python obiekty realizowane w C może eksportować grupę funkcji o nazwie „bufor interfejs.”

Twoja klasa Foo nie jest zaimplementowany w C, jest to...?

Powiązane problemy