2010-01-16 68 views
13

我有一個serialize方法的自定義類,我希望能夠將這個類直接寫入文件,並使用Python 2.6編寫返回值爲serialize的方法。 (我不是要pickle我的對象,這是完全不同的東西。)例如:哪些方法在Python中實現緩衝區接口?

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 

好吧,所以我需要我的Foo類來實現buffer接口。我甚至在the buffer documentation中看到它說:「緩衝區接口的一個例子是文件對象的write()方法。任何可以通過緩衝區接口輸出一系列字節的對象都可以寫入文件中。

顯然,我可以做我想做的事,但文檔實際上並沒有說我需要實現哪些方法才能實現緩衝區接口。我試過實施__str__,__unicode__,__len__,甚至__sizeof__。我實施了__getitem__,__setitem____delitem__,接受intslice參數。我甚至嘗試過爲了安全而實施已棄用的__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擴展類中實現的東西嗎?還是我錯過了明顯的東西?

回答

11

特別是,沒有特殊的方法可以直接實現純Python編碼類來支持buffer接口 - 這可能是PEP 298,但它已被撤銷。

恐怕你將不得不使用一些明確的屬性或方法(或內置在像str在內部調用的特殊方法),以你的類的實例傳遞給file.write &Ç:-(。

+0

唉,謝謝你的確認,我自己找不到明確表示你不能在Python中實現緩衝區接口的東西。 – 2010-01-16 23:42:35

1

文檔說,

的Python用C語言實現可 導出一組函數調用 「緩衝界面。」對象

你的Foo類沒有用C實現的,是它...?