2010-01-16 3 views
13

serialize 메서드가있는 사용자 정의 클래스가 있고이 클래스를 파일에 직접 작성하고 serialize 메서드의 반환 값을 파이썬 2.6에서 작성하려고합니다. (I, 이것은 완전히 다른 뭔가가 내 개체를 pickle 위해 노력하고 있지 않다.) 예를 들면 :어떤 방법으로 파이썬에서 버퍼 인터페이스를 구현합니까?

이 코드를 실행하면
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 

좋아요 수, 그래서 buffer 인터페이스를 구현하려면 내 Foo 클래스가 필요합니다. 심지어는 the buffer documentation에 "버퍼 인터페이스의 예제 사용자는 파일 객체의 write() 메소드입니다. 버퍼 인터페이스를 통해 일련의 바이트를 내보낼 수있는 객체는 파일에 쓸 수 있습니다."

분명히 내가 원하는대로 할 수는 있지만 문서는 실제로 버퍼 인터페이스를 구현하기 위해 구현해야하는 메서드를 말하지 않습니다. 나는 __str__, __unicode__, __len__ 및 심지어 __sizeof__을 구현하려고 시도했습니다. __getitem__, __setitem____delitem__을 구현했으며 intslice 인수를 모두 허용했습니다. 심지어 안전을 위해 더 이상 사용되지 않는 __getslice__, __setslice____delslice__ 메서드를 구현하려고 시도했습니다. 내가 뭘하려고해도, 나는 여전히 똑같은 예외를 얻는다.

>>> 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__'] 

내가 하나 하나 모두를 구현하지 않도록하고 싶습니다, 그리고 특히 정확히에 대한 문서를 찾으려면 :

는 참고로, 여기에 buffer 내장 클래스의 방법입니다 어떤 방법이 필요한가?

C 확장 클래스에서만 구현할 수있는 기능입니까? 또는 나는 명백한 것을 놓치고 있는가?

답변

11

특별히, 순수 파이썬 코드 클래스가 buffer 인터페이스를 지원하기 위해 직접 구현할 수있는 특별한 방법은 없습니다. 즉, PEP 298 이었지만 철회되었습니다.

난 당신이 어떤 명시 적 속성 또는 메서드 (또는 내장 내부적으로 특별한 메소드를 호출 str 같은) file.write & C :-(에 클래스의 인스턴스를 전달합니다.

+0

을 사용해야 될 것 같아요 아아, 이걸 확인해 줘서 고마워, 네가 파이썬에서 버퍼 인터페이스를 구현할 수 없다고 명시 적으로 말한 것을 찾지 못했다. –

1

문서는 말한다

이 가 파이썬은 "인터페이스 버퍼."는 호출되는 함수의 그룹을 내보낼 수 있습니다 C로 구현 객체

귀하의 푸 클래스 C에서 구현되지

입니다

그것...?

관련 문제